From 5c529e6318d46121a5ea38d3edb42c8d9f580fe8 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Tue, 21 Mar 2017 11:31:25 -0400 Subject: Combine more RTF and TXT Break code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This Cl conbines several more methods from RTFBreak and TXTBreak into the common Break baseclass. Change-Id: Ibe2236eb4fd30faab239e7c9c8b578164014eb39 Reviewed-on: https://pdfium-review.googlesource.com/3108 Reviewed-by: Nicolás Peña Commit-Queue: dsinclair --- xfa/fde/cfde_txtedtpage.cpp | 6 ++-- xfa/fde/cfde_txtedtparag.cpp | 2 +- xfa/fde/tto/fde_textout.cpp | 6 ++-- xfa/fgas/layout/cfx_break.cpp | 59 +++++++++++++++++++++++++++++++ xfa/fgas/layout/cfx_break.h | 11 +++++- xfa/fgas/layout/fgas_rtfbreak.cpp | 72 ++++---------------------------------- xfa/fgas/layout/fgas_rtfbreak.h | 8 ----- xfa/fgas/layout/fgas_textbreak.cpp | 63 +++------------------------------ xfa/fgas/layout/fgas_textbreak.h | 7 ---- 9 files changed, 87 insertions(+), 147 deletions(-) diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp index c3d21430bd..3a1c9ab88f 100644 --- a/xfa/fde/cfde_txtedtpage.cpp +++ b/xfa/fde/cfde_txtedtpage.cpp @@ -296,16 +296,16 @@ int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox, if (!CFX_BreakTypeNoneOrPiece(dwBreakStatus)) { int32_t nPieceCount = pBreak->CountBreakPieces(); for (int32_t j = 0; j < nPieceCount; j++) { - const CFX_BreakPiece* pPiece = pBreak->GetBreakPiece(j); + const CFX_BreakPiece* pPiece = pBreak->GetBreakPieceUnstable(j); FDE_TEXTEDITPIECE TxtEdtPiece; FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE)); TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel; TxtEdtPiece.nCount = pPiece->GetLength(); TxtEdtPiece.nStart = nPieceStart; TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles; - if (FX_IsOdd(pPiece->m_iBidiLevel)) { + if (FX_IsOdd(pPiece->m_iBidiLevel)) TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel; - } + float fParaBreakWidth = 0.0f; if (!CFX_BreakTypeNoneOrPiece(pPiece->m_dwStatus)) { wchar_t wRtChar = pParams->wLineBreakChar; diff --git a/xfa/fde/cfde_txtedtparag.cpp b/xfa/fde/cfde_txtedtparag.cpp index d22fa53c02..d76fd7114f 100644 --- a/xfa/fde/cfde_txtedtparag.cpp +++ b/xfa/fde/cfde_txtedtparag.cpp @@ -63,7 +63,7 @@ void CFDE_TxtEdtParag::LoadParag() { int32_t nCount = pTxtBreak->CountBreakPieces(); int32_t nTotal = 0; for (int32_t j = 0; j < nCount; j++) { - const CFX_BreakPiece* Piece = pTxtBreak->GetBreakPiece(j); + const CFX_BreakPiece* Piece = pTxtBreak->GetBreakPieceUnstable(j); nTotal += Piece->GetLength(); } LineBaseArr.Add(nTotal); diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp index 6808ff0c6c..6d56ec70c8 100644 --- a/xfa/fde/tto/fde_textout.cpp +++ b/xfa/fde/tto/fde_textout.cpp @@ -244,7 +244,7 @@ bool CFDE_TextOut::RetrieveLineWidth(CFX_BreakType dwBreakStatus, float fLineWidth = 0.0f; int32_t iCount = m_pTxtBreak->CountBreakPieces(); for (int32_t i = 0; i < iCount; i++) { - const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPieceUnstable(i); fLineWidth += static_cast(pPiece->m_iWidth) / 20000.0f; fStartPos = std::min(fStartPos, static_cast(pPiece->m_iStartPos) / 20000.0f); @@ -386,7 +386,7 @@ void CFDE_TextOut::RetrieveEllPieces(std::vector* pCharWidths) { int32_t iCount = m_pTxtBreak->CountBreakPieces(); int32_t iCharIndex = 0; for (int32_t i = 0; i < iCount; i++) { - const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPieceUnstable(i); int32_t iPieceChars = pPiece->GetLength(); for (int32_t j = 0; j < iPieceChars; j++) { (*pCharWidths)[iCharIndex] = @@ -466,7 +466,7 @@ bool CFDE_TextOut::RetrievePieces(CFX_BreakType dwBreakStatus, int32_t iLineWidth = FXSYS_round(fLineWidth * 20000.0f); int32_t iCount = m_pTxtBreak->CountBreakPieces(); for (int32_t i = 0; i < iCount; i++) { - const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPieceUnstable(i); int32_t iPieceChars = pPiece->GetLength(); int32_t iChar = iStartChar; int32_t iWidth = 0; diff --git a/xfa/fgas/layout/cfx_break.cpp b/xfa/fgas/layout/cfx_break.cpp index a8280b1161..52236f3176 100644 --- a/xfa/fgas/layout/cfx_break.cpp +++ b/xfa/fgas/layout/cfx_break.cpp @@ -7,6 +7,9 @@ #include "xfa/fgas/layout/cfx_break.h" #include +#include + +#include "third_party/base/stl_util.h" namespace { @@ -18,6 +21,7 @@ CFX_Break::CFX_Break(uint32_t dwLayoutStyles) : m_eCharType(FX_CHARTYPE_Unknown), m_bSingleLine(false), m_bCombText(false), + m_dwIdentity(0), m_dwLayoutStyles(dwLayoutStyles), m_iLineStart(0), m_iLineWidth(2000000), @@ -88,6 +92,21 @@ void CFX_Break::SetFontSize(float fFontSize) { FontChanged(); } +void CFX_Break::SetBreakStatus() { + ++m_dwIdentity; + int32_t iCount = m_pCurLine->CountChars(); + if (iCount < 1) + return; + + CFX_Char* tc = m_pCurLine->GetChar(iCount - 1); + if (tc->m_dwStatus == CFX_BreakType::None) + tc->m_dwStatus = CFX_BreakType::Piece; +} + +FX_CHARTYPE CFX_Break::GetUnifiedCharType(FX_CHARTYPE chartype) const { + return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; +} + void CFX_Break::FontChanged() { m_iDefChar = 0; if (!m_pFont || m_wDefChar == 0xFEFF) @@ -140,3 +159,43 @@ void CFX_Break::SetLineBoundary(float fLineStart, float fLineEnd) { m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iLineWidth); m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iLineStart); } + +CFX_Char* CFX_Break::GetLastChar(int32_t index, + bool bOmitChar, + bool bRichText) const { + std::vector& tca = m_pCurLine->m_LineChars; + if (!pdfium::IndexInBounds(tca, index)) + return nullptr; + + int32_t iStart = pdfium::CollectionSize(tca) - 1; + while (iStart > -1) { + CFX_Char* pTC = &tca[iStart--]; + if (((bRichText && pTC->m_iCharWidth < 0) || bOmitChar) && + pTC->GetCharType() == FX_CHARTYPE_Combination) { + continue; + } + if (--index < 0) + return pTC; + } + return nullptr; +} + +int32_t CFX_Break::CountBreakPieces() const { + return HasLine() ? pdfium::CollectionSize( + m_Line[m_iReadyLineIndex].m_LinePieces) + : 0; +} + +const CFX_BreakPiece* CFX_Break::GetBreakPieceUnstable(int32_t index) const { + if (!HasLine()) + return nullptr; + if (!pdfium::IndexInBounds(m_Line[m_iReadyLineIndex].m_LinePieces, index)) + return nullptr; + return &m_Line[m_iReadyLineIndex].m_LinePieces[index]; +} + +void CFX_Break::ClearBreakPieces() { + if (HasLine()) + m_Line[m_iReadyLineIndex].Clear(); + m_iReadyLineIndex = -1; +} diff --git a/xfa/fgas/layout/cfx_break.h b/xfa/fgas/layout/cfx_break.h index 631cc5aaa1..4a7185bd70 100644 --- a/xfa/fgas/layout/cfx_break.h +++ b/xfa/fgas/layout/cfx_break.h @@ -50,14 +50,23 @@ class CFX_Break { void SetParagraphBreakChar(wchar_t wch); void SetDefaultChar(wchar_t wch); - virtual void SetBreakStatus() = 0; + int32_t CountBreakPieces() const; + const CFX_BreakPiece* GetBreakPieceUnstable(int32_t index) const; + void ClearBreakPieces(); + + CFX_Char* GetLastChar(int32_t index, bool bOmitChar, bool bRichText) const; protected: explicit CFX_Break(uint32_t dwLayoutStyles); + void SetBreakStatus(); + bool HasLine() const { return m_iReadyLineIndex >= 0; } + FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const; + FX_CHARTYPE m_eCharType; bool m_bSingleLine; bool m_bCombText; + uint32_t m_dwIdentity; uint32_t m_dwLayoutStyles; int32_t m_iLineStart; int32_t m_iLineWidth; diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp index 81fbea0cc6..07a3cefa69 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.cpp +++ b/xfa/fgas/layout/fgas_rtfbreak.cpp @@ -17,8 +17,7 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwLayoutStyles) : CFX_Break(dwLayoutStyles), m_bPagination(false), m_iAlignment(CFX_RTFLineAlignment::Left), - m_pUserData(nullptr), - m_dwIdentity(0) { + m_pUserData(nullptr) { SetBreakStatus(); m_bPagination = !!(m_dwLayoutStyles & FX_LAYOUTSTYLE_Pagination); } @@ -50,40 +49,6 @@ void CFX_RTFBreak::SetUserData(const CFX_RetainPtr& pUserData) { m_pUserData = pUserData; } -void CFX_RTFBreak::SetBreakStatus() { - ++m_dwIdentity; - int32_t iCount = m_pCurLine->CountChars(); - if (iCount < 1) - return; - - CFX_Char* tc = m_pCurLine->GetChar(iCount - 1); - if (tc->m_dwStatus == CFX_BreakType::None) - tc->m_dwStatus = CFX_BreakType::Piece; -} - -CFX_Char* CFX_RTFBreak::GetLastChar(int32_t index) const { - std::vector& tca = m_pCurLine->m_LineChars; - int32_t iCount = pdfium::CollectionSize(tca); - if (index < 0 || index >= iCount) - return nullptr; - - int32_t iStart = iCount - 1; - while (iStart > -1) { - CFX_Char* pTC = &tca[iStart--]; - if (pTC->m_iCharWidth >= 0 || - pTC->GetCharType() != FX_CHARTYPE_Combination) { - if (--index < 0) - return pTC; - } - } - return nullptr; -} - -inline FX_CHARTYPE CFX_RTFBreak::GetUnifiedCharType( - FX_CHARTYPE chartype) const { - return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; -} - int32_t CFX_RTFBreak::GetLastPositionedTab() const { return m_PositionedTabs.empty() ? m_iLineStart : m_PositionedTabs.back(); } @@ -167,7 +132,7 @@ void CFX_RTFBreak::AppendChar_Combination(CFX_Char* pCurChar) { iCharWidth *= m_iFontSize; iCharWidth = iCharWidth * m_iHorizontalScale / 100; - CFX_Char* pLastChar = GetLastChar(0); + CFX_Char* pLastChar = GetLastChar(0, false, true); if (pLastChar && pLastChar->GetCharType() > FX_CHARTYPE_Combination) iCharWidth = -iCharWidth; else @@ -224,10 +189,10 @@ CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_Char* pCurChar) { bool bAlef = false; if (m_eCharType >= FX_CHARTYPE_ArabicAlef && m_eCharType <= FX_CHARTYPE_ArabicDistortion) { - pLastChar = GetLastChar(1); + pLastChar = GetLastChar(1, false, true); if (pLastChar) { m_pCurLine->m_iWidth -= pLastChar->m_iCharWidth; - CFX_Char* pPrevChar = GetLastChar(2); + CFX_Char* pPrevChar = GetLastChar(2, false, true); wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); bAlef = (wForm == 0xFEFF && pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); @@ -292,7 +257,7 @@ CFX_BreakType CFX_RTFBreak::EndBreak(CFX_BreakType dwStatus) { return m_pCurLine->m_LinePieces.back().m_dwStatus; } - if (HasRTFLine()) { + if (HasLine()) { if (!m_Line[m_iReadyLineIndex].m_LinePieces.empty()) { if (dwStatus != CFX_BreakType::Piece) m_Line[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus = dwStatus; @@ -324,7 +289,7 @@ CFX_BreakType CFX_RTFBreak::EndBreak(CFX_BreakType dwStatus) { m_pCurLine = pNextLine; m_pCurLine->m_iStart = m_iLineStart; - CFX_Char* pTC = GetLastChar(0); + CFX_Char* pTC = GetLastChar(0, false, true); m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; return dwStatus; } @@ -698,31 +663,6 @@ void CFX_RTFBreak::SplitTextLine(CFX_BreakLine* pCurLine, } } -int32_t CFX_RTFBreak::CountBreakPieces() const { - return HasRTFLine() ? pdfium::CollectionSize( - m_Line[m_iReadyLineIndex].m_LinePieces) - : 0; -} - -const CFX_BreakPiece* CFX_RTFBreak::GetBreakPieceUnstable(int32_t index) const { - if (!HasRTFLine()) - return nullptr; - - const std::vector& pRTFPieces = - m_Line[m_iReadyLineIndex].m_LinePieces; - if (!pdfium::IndexInBounds(pRTFPieces, index)) - return nullptr; - - return &pRTFPieces[index]; -} - -void CFX_RTFBreak::ClearBreakPieces() { - if (HasRTFLine()) - m_Line[m_iReadyLineIndex].Clear(); - - m_iReadyLineIndex = -1; -} - int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, FXTEXT_CHARPOS* pCharPos, bool bCharCode) const { diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h index 865b17ffb3..7cbd250218 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.h +++ b/xfa/fgas/layout/fgas_rtfbreak.h @@ -56,9 +56,6 @@ class CFX_RTFBreak : public CFX_Break { void AddPositionedTab(float fTabPos); CFX_BreakType EndBreak(CFX_BreakType dwStatus); - int32_t CountBreakPieces() const; - const CFX_BreakPiece* GetBreakPieceUnstable(int32_t index) const; - void ClearBreakPieces(); int32_t GetDisplayPos(const FX_RTFTEXTOBJ* pText, FXTEXT_CHARPOS* pCharPos, @@ -74,10 +71,6 @@ class CFX_RTFBreak : public CFX_Break { CFX_BreakType AppendChar_Control(CFX_Char* pCurChar); CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar); CFX_BreakType AppendChar_Others(CFX_Char* pCurChar); - void SetBreakStatus() override; - CFX_Char* GetLastChar(int32_t index) const; - bool HasRTFLine() const { return m_iReadyLineIndex >= 0; } - FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE chartype) const; int32_t GetLastPositionedTab() const; bool GetPositionedTab(int32_t* iTabPos) const; @@ -100,7 +93,6 @@ class CFX_RTFBreak : public CFX_Break { std::vector m_PositionedTabs; CFX_RTFLineAlignment m_iAlignment; CFX_RetainPtr m_pUserData; - uint32_t m_dwIdentity; }; #endif // XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_ diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp index 41091700fb..c21d6bba3a 100644 --- a/xfa/fgas/layout/fgas_textbreak.cpp +++ b/xfa/fgas/layout/fgas_textbreak.cpp @@ -46,37 +46,6 @@ void CFX_TxtBreak::SetCombWidth(float fCombWidth) { m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); } -void CFX_TxtBreak::SetBreakStatus() { - int32_t iCount = m_pCurLine->CountChars(); - if (iCount < 1) - return; - - CFX_Char* pTC = m_pCurLine->GetChar(iCount - 1); - if (pTC->m_dwStatus == CFX_BreakType::None) - pTC->m_dwStatus = CFX_BreakType::Piece; -} -CFX_Char* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const { - std::vector& ca = m_pCurLine->m_LineChars; - int32_t iCount = pdfium::CollectionSize(ca); - if (index < 0 || index >= iCount) - return nullptr; - - int32_t iStart = iCount - 1; - while (iStart > -1) { - CFX_Char* pTC = &ca[iStart--]; - if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) - continue; - if (--index < 0) - return pTC; - } - return nullptr; -} - -inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( - FX_CHARTYPE chartype) const { - return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; -} - void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, uint32_t dwProps) { pCurChar->m_dwStatus = CFX_BreakType::None; pCurChar->m_dwCharStyles = m_iAlignment | (1 << 8); @@ -91,7 +60,7 @@ void CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar) { iCharWidth = m_iCombWidth; } else { wForm = wch; - CFX_Char* pLastChar = GetLastChar(0, false); + CFX_Char* pLastChar = GetLastChar(0, false, false); if (pLastChar && (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { bool bShadda = false; @@ -162,13 +131,13 @@ CFX_BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar) { bool bAlef = false; if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && m_eCharType <= FX_CHARTYPE_ArabicDistortion) { - pLastChar = GetLastChar(1); + pLastChar = GetLastChar(1, true, false); if (pLastChar) { iCharWidth = pLastChar->m_iCharWidth; if (iCharWidth > 0) iLineWidth -= iCharWidth; - CFX_Char* pPrevChar = GetLastChar(2); + CFX_Char* pPrevChar = GetLastChar(2, true, false); wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); bAlef = (wForm == 0xFEFF && pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); @@ -514,7 +483,7 @@ CFX_BreakType CFX_TxtBreak::EndBreak(CFX_BreakType dwStatus) { return m_pCurLine->m_LinePieces.back().m_dwStatus; } - if (HasTxtLine()) { + if (HasLine()) { if (!m_Line[m_iReadyLineIndex].m_LinePieces.empty()) { if (dwStatus != CFX_BreakType::Piece) m_Line[m_iReadyLineIndex].m_LinePieces.back().m_dwStatus = dwStatus; @@ -542,7 +511,7 @@ CFX_BreakType CFX_TxtBreak::EndBreak(CFX_BreakType dwStatus) { } m_pCurLine = pNextLine; - CFX_Char* pTC = GetLastChar(0, false); + CFX_Char* pTC = GetLastChar(0, false, false); m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; return dwStatus; @@ -682,28 +651,6 @@ void CFX_TxtBreak::SplitTextLine(CFX_BreakLine* pCurLine, pNextLine->m_iWidth = iWidth; } -int32_t CFX_TxtBreak::CountBreakPieces() const { - return HasTxtLine() ? pdfium::CollectionSize( - m_Line[m_iReadyLineIndex].m_LinePieces) - : 0; -} - -const CFX_BreakPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { - if (!HasTxtLine()) - return nullptr; - - if (!pdfium::IndexInBounds(m_Line[m_iReadyLineIndex].m_LinePieces, index)) - return nullptr; - - return &m_Line[m_iReadyLineIndex].m_LinePieces[index]; -} - -void CFX_TxtBreak::ClearBreakPieces() { - if (HasTxtLine()) - m_Line[m_iReadyLineIndex].Clear(); - m_iReadyLineIndex = -1; -} - struct FX_FORMCHAR { uint16_t wch; uint16_t wForm; diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h index 439a7ee15b..81aaf58219 100644 --- a/xfa/fgas/layout/fgas_textbreak.h +++ b/xfa/fgas/layout/fgas_textbreak.h @@ -64,9 +64,6 @@ class CFX_TxtBreak : public CFX_Break { void SetAlignment(int32_t iAlignment); void SetCombWidth(float fCombWidth); CFX_BreakType EndBreak(CFX_BreakType dwStatus); - int32_t CountBreakPieces() const; - const CFX_BreakPiece* GetBreakPiece(int32_t index) const; - void ClearBreakPieces(); int32_t GetDisplayPos(const FX_TXTRUN* pTxtRun, FXTEXT_CHARPOS* pCharPos, @@ -84,10 +81,6 @@ class CFX_TxtBreak : public CFX_Break { CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar); CFX_BreakType AppendChar_Others(CFX_Char* pCurChar); - void SetBreakStatus() override; - CFX_Char* GetLastChar(int32_t index, bool bOmitChar = true) const; - bool HasTxtLine() const { return m_iReadyLineIndex >= 0; } - FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const; void ResetContextCharStyles(); bool EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars); void EndBreak_BidiLine(std::deque* tpos, CFX_BreakType dwStatus); -- cgit v1.2.3