diff options
-rw-r--r-- | xfa/fgas/layout/fgas_rtfbreak.cpp | 85 | ||||
-rw-r--r-- | xfa/fgas/layout/fgas_rtfbreak.h | 25 | ||||
-rw-r--r-- | xfa/fgas/layout/fgas_rtfbreak_unittest.cpp | 6 | ||||
-rw-r--r-- | xfa/fxfa/app/cxfa_textlayout.cpp | 4 |
4 files changed, 46 insertions, 74 deletions
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp index 774d78f79e..50fda35bdd 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.cpp +++ b/xfa/fgas/layout/fgas_rtfbreak.cpp @@ -41,9 +41,7 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwLayoutStyles) m_bPagination = !!(m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination); } -CFX_RTFBreak::~CFX_RTFBreak() { - Reset(); -} +CFX_RTFBreak::~CFX_RTFBreak() {} void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) { if (fLineStart > fLineEnd) @@ -381,32 +379,22 @@ CFX_RTFBreakType CFX_RTFBreak::EndBreak(CFX_RTFBreakType dwStatus) { ASSERT(dwStatus != CFX_RTFBreakType::None); ++m_dwIdentity; - const CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; - int32_t iCount = pCurPieces->GetSize(); - if (iCount > 0) { - CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); + if (!m_pCurLine->m_LinePieces.empty()) { if (dwStatus != CFX_RTFBreakType::Piece) - pLastPiece->m_dwStatus = dwStatus; - else - dwStatus = pLastPiece->m_dwStatus; - return dwStatus; + m_pCurLine->m_LinePieces.back().m_dwStatus = dwStatus; + return m_pCurLine->m_LinePieces.back().m_dwStatus; } if (HasRTFLine()) { - pCurPieces = &m_RTFLine[m_iReady].m_LinePieces; - iCount = pCurPieces->GetSize(); - if (iCount-- > 0) { - CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); + if (!m_RTFLine[m_iReady].m_LinePieces.empty()) { if (dwStatus != CFX_RTFBreakType::Piece) - pLastPiece->m_dwStatus = dwStatus; - else - dwStatus = pLastPiece->m_dwStatus; - return dwStatus; + m_RTFLine[m_iReady].m_LinePieces.back().m_dwStatus = dwStatus; + return m_RTFLine[m_iReady].m_LinePieces.back().m_dwStatus; } return CFX_RTFBreakType::None; } - iCount = m_pCurLine->CountChars(); + int32_t iCount = m_pCurLine->CountChars(); if (iCount < 1) return CFX_RTFBreakType::None; @@ -494,7 +482,7 @@ bool CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, tp.m_iChars += 1; ++i; } - m_pCurLine->m_LinePieces.Add(tp); + m_pCurLine->m_LinePieces.push_back(tp); bNew = true; } else { tp.m_iWidth += pTC->m_iCharWidth; @@ -560,7 +548,8 @@ void CFX_RTFBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos, } else if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwIdentity != dwIdentity) { tp.m_iChars = i - tp.m_iStartChar; - m_pCurLine->m_LinePieces.Add(tp); + m_pCurLine->m_LinePieces.push_back(tp); + tp.m_iStartPos += tp.m_iWidth; tp.m_iStartChar = i; tpo.index = j++; @@ -578,7 +567,8 @@ void CFX_RTFBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos, if (i > tp.m_iStartChar) { tp.m_dwStatus = dwStatus; tp.m_iChars = i - tp.m_iStartChar; - m_pCurLine->m_LinePieces.Add(tp); + m_pCurLine->m_LinePieces.push_back(tp); + tpo.index = j; tpo.pos = tp.m_iBidiPos; tpos->push_back(tpo); @@ -587,7 +577,7 @@ void CFX_RTFBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos, std::sort(tpos->begin(), tpos->end()); int32_t iStartPos = m_pCurLine->m_iStart; for (const auto& it : *tpos) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces.GetAt(it.index); + CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces[it.index]; ttp.m_iStartPos = iStartPos; iStartPos += ttp.m_iWidth; } @@ -598,10 +588,9 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos, CFX_RTFBreakType dwStatus) { int32_t iNetWidth = m_pCurLine->m_iWidth; int32_t iGapChars = 0; - int32_t iCount = m_pCurLine->m_LinePieces.GetSize(); bool bFind = false; - for (int32_t i = iCount - 1; i > -1; --i) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces.GetAt(tpos[i].index); + for (auto it = tpos.rbegin(); it != tpos.rend(); it++) { + CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces[it->index]; if (!bFind) iNetWidth = ttp.GetEndPos(); @@ -638,8 +627,8 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos, (m_iAlignment == CFX_RTFLineAlignment::Justified && dwStatus != CFX_RTFBreakType::Paragraph))) { int32_t iStart = -1; - for (int32_t i = 0; i < iCount; ++i) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces.GetAt(tpos[i].index); + for (const auto& tpo : tpos) { + CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; if (iStart < 0) iStart = ttp.m_iStartPos; else @@ -665,10 +654,8 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos, if (m_iAlignment == CFX_RTFLineAlignment::Center) iOffset /= 2; if (iOffset > 0) { - for (int32_t i = 0; i < iCount; ++i) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces.GetAt(i); + for (auto& ttp : m_pCurLine->m_LinePieces) ttp.m_iStartPos += iOffset; - } } } } @@ -784,7 +771,7 @@ void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, ++iCharPos; if (iCharPos >= iCount) { - pNextLine->RemoveAll(true); + pNextLine->Clear(); curChars[iCharPos - 1].m_nBreakType = FX_LBT_UNKNOWN; return; } @@ -807,30 +794,33 @@ void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, } int32_t CFX_RTFBreak::CountBreakPieces() const { - return HasRTFLine() ? m_RTFLine[m_iReady].m_LinePieces.GetSize() : 0; + return HasRTFLine() + ? pdfium::CollectionSize<int32_t>(m_RTFLine[m_iReady].m_LinePieces) + : 0; } -const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const { +const CFX_RTFPiece* CFX_RTFBreak::GetBreakPieceUnstable(int32_t index) const { if (!HasRTFLine()) return nullptr; - const CFX_RTFPieceArray* pRTFPieces = &m_RTFLine[m_iReady].m_LinePieces; - if (index < 0 || index >= pRTFPieces->GetSize()) + const std::vector<CFX_RTFPiece>& pRTFPieces = + m_RTFLine[m_iReady].m_LinePieces; + if (index < 0 || index >= pdfium::CollectionSize<int32_t>(pRTFPieces)) return nullptr; - return pRTFPieces->GetPtrAt(index); + return &pRTFPieces[index]; } void CFX_RTFBreak::ClearBreakPieces() { if (HasRTFLine()) - m_RTFLine[m_iReady].RemoveAll(true); + m_RTFLine[m_iReady].Clear(); m_iReady = -1; } void CFX_RTFBreak::Reset() { m_eCharType = FX_CHARTYPE_Unknown; - m_RTFLine[0].RemoveAll(true); - m_RTFLine[1].RemoveAll(true); + m_RTFLine[0].Clear(); + m_RTFLine[1].Clear(); } int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, @@ -963,16 +953,13 @@ CFX_RTFPiece::CFX_RTFPiece() m_pChars(nullptr), m_pUserData(nullptr) {} -CFX_RTFPiece::~CFX_RTFPiece() { - Reset(); -} +CFX_RTFPiece::CFX_RTFPiece(const CFX_RTFPiece& other) = default; -CFX_RTFLine::CFX_RTFLine() - : m_LinePieces(16), m_iStart(0), m_iWidth(0), m_iArabicChars(0) {} +CFX_RTFPiece::~CFX_RTFPiece() {} -CFX_RTFLine::~CFX_RTFLine() { - RemoveAll(false); -} +CFX_RTFLine::CFX_RTFLine() : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {} + +CFX_RTFLine::~CFX_RTFLine() {} FX_RTFTEXTOBJ::FX_RTFTEXTOBJ() : pFont(nullptr), diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h index 835430e919..125b06fe95 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.h +++ b/xfa/fgas/layout/fgas_rtfbreak.h @@ -48,6 +48,7 @@ struct FX_RTFTEXTOBJ { class CFX_RTFPiece { public: CFX_RTFPiece(); + CFX_RTFPiece(const CFX_RTFPiece& other); ~CFX_RTFPiece(); int32_t GetEndPos() const { @@ -75,20 +76,6 @@ class CFX_RTFPiece { return ret; } - void Reset() { - m_dwStatus = CFX_RTFBreakType::Piece; - if (m_iWidth > -1) - m_iStartPos += m_iWidth; - - m_iWidth = -1; - m_iStartChar += m_iChars; - m_iChars = 0; - m_iBidiLevel = 0; - m_iBidiPos = 0; - m_iHorizontalScale = 100; - m_iVerticalScale = 100; - } - CFX_RTFBreakType m_dwStatus; int32_t m_iStartPos; int32_t m_iWidth; @@ -105,8 +92,6 @@ class CFX_RTFPiece { CFX_RetainPtr<CFX_Retainable> m_pUserData; }; -typedef CFX_BaseArrayTemplate<CFX_RTFPiece> CFX_RTFPieceArray; - class CFX_RTFLine { public: CFX_RTFLine(); @@ -122,15 +107,15 @@ class CFX_RTFLine { } int32_t GetLineEnd() const { return m_iStart + m_iWidth; } - void RemoveAll(bool bLeaveMemory) { + void Clear() { m_LineChars.clear(); - m_LinePieces.RemoveAll(bLeaveMemory); + m_LinePieces.clear(); m_iWidth = 0; m_iArabicChars = 0; } std::vector<CFX_RTFChar> m_LineChars; - CFX_RTFPieceArray m_LinePieces; + std::vector<CFX_RTFPiece> m_LinePieces; int32_t m_iStart; int32_t m_iWidth; int32_t m_iArabicChars; @@ -157,7 +142,7 @@ class CFX_RTFBreak { CFX_RTFBreakType EndBreak(CFX_RTFBreakType dwStatus); int32_t CountBreakPieces() const; - const CFX_RTFPiece* GetBreakPiece(int32_t index) const; + const CFX_RTFPiece* GetBreakPieceUnstable(int32_t index) const; void ClearBreakPieces(); void Reset(); diff --git a/xfa/fgas/layout/fgas_rtfbreak_unittest.cpp b/xfa/fgas/layout/fgas_rtfbreak_unittest.cpp index aba440aac7..bbac9d5806 100644 --- a/xfa/fgas/layout/fgas_rtfbreak_unittest.cpp +++ b/xfa/fgas/layout/fgas_rtfbreak_unittest.cpp @@ -58,7 +58,7 @@ TEST_F(RTFBreakTest, AddChars) { EXPECT_EQ(CFX_RTFBreakType::Paragraph, b->AppendChar(L'\n')); ASSERT_EQ(1, b->CountBreakPieces()); - EXPECT_EQ(str + L"\n", b->GetBreakPiece(0)->GetString()); + EXPECT_EQ(str + L"\n", b->GetBreakPieceUnstable(0)->GetString()); b->ClearBreakPieces(); b->Reset(); @@ -71,7 +71,7 @@ TEST_F(RTFBreakTest, AddChars) { // Force the end of the break at the end of the string. b->EndBreak(CFX_RTFBreakType::Paragraph); ASSERT_EQ(1, b->CountBreakPieces()); - EXPECT_EQ(str, b->GetBreakPiece(0)->GetString()); + EXPECT_EQ(str, b->GetBreakPieceUnstable(0)->GetString()); } TEST_F(RTFBreakTest, ControlCharacters) { @@ -83,5 +83,5 @@ TEST_F(RTFBreakTest, ControlCharacters) { EXPECT_EQ(CFX_RTFBreakType::Paragraph, b->AppendChar(L'\n')); ASSERT_EQ(1, b->CountBreakPieces()); - EXPECT_EQ(L"\v", b->GetBreakPiece(0)->GetString()); + EXPECT_EQ(L"\v", b->GetBreakPieceUnstable(0)->GetString()); } diff --git a/xfa/fxfa/app/cxfa_textlayout.cpp b/xfa/fxfa/app/cxfa_textlayout.cpp index 06cbfe0c70..676aded844 100644 --- a/xfa/fxfa/app/cxfa_textlayout.cpp +++ b/xfa/fxfa/app/cxfa_textlayout.cpp @@ -1033,7 +1033,7 @@ void CXFA_TextLayout::AppendTextLine(CFX_RTFBreakType dwStatus, FX_FLOAT fLineStep = 0, fBaseLine = 0; int32_t i = 0; for (i = 0; i < iPieces; i++) { - const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); + const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); CXFA_TextUserData* pUserData = static_cast<CXFA_TextUserData*>(pPiece->m_pUserData.Get()); if (pUserData) @@ -1088,7 +1088,7 @@ void CXFA_TextLayout::AppendTextLine(CFX_RTFBreakType dwStatus, FX_FLOAT fLineStep = 0; FX_FLOAT fLineWidth = 0; for (int32_t i = 0; i < iPieces; i++) { - const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i); + const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); CXFA_TextUserData* pUserData = static_cast<CXFA_TextUserData*>(pPiece->m_pUserData.Get()); if (pUserData) |