From 893822aa5b6254591f8e80fbffcbb4fa6ad849aa Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 13 Mar 2017 15:32:07 -0400 Subject: Merge text breaking helper classes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This Cl merges the CFX_TxtPiece and CFX_RTFPiece classes into CFX_BreakPiece. CFX_TxtLine and CFX_RTFLine into CFX_BreakLine and CFX_TxtChar and CFX_RTFChar into CFX_Char. Change-Id: I95421bdf4cafd5e394db9238dea3603ccb8349c3 Reviewed-on: https://pdfium-review.googlesource.com/2966 Reviewed-by: Nicolás Peña Commit-Queue: dsinclair --- xfa/fde/cfde_txtedtpage.cpp | 4 +- xfa/fde/cfde_txtedtparag.cpp | 2 +- xfa/fde/tto/fde_textout.cpp | 13 ++-- xfa/fde/tto/fde_textout.h | 2 +- xfa/fgas/layout/cfx_breakline.cpp | 55 +++++++++++++++++ xfa/fgas/layout/cfx_breakline.h | 39 ++++++++++++ xfa/fgas/layout/cfx_breakpiece.cpp | 53 ++++++++++++++++ xfa/fgas/layout/cfx_breakpiece.h | 46 ++++++++++++++ xfa/fgas/layout/fgas_rtfbreak.cpp | 118 ++++++++++++++---------------------- xfa/fgas/layout/fgas_rtfbreak.h | 104 +++++-------------------------- xfa/fgas/layout/fgas_textbreak.cpp | 105 +++++++++++++------------------- xfa/fgas/layout/fgas_textbreak.h | 121 +++++-------------------------------- xfa/fxfa/app/cxfa_textlayout.cpp | 4 +- 13 files changed, 325 insertions(+), 341 deletions(-) create mode 100644 xfa/fgas/layout/cfx_breakline.cpp create mode 100644 xfa/fgas/layout/cfx_breakline.h create mode 100644 xfa/fgas/layout/cfx_breakpiece.cpp create mode 100644 xfa/fgas/layout/cfx_breakpiece.h (limited to 'xfa') diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp index fd44b28ef2..f0a33d0516 100644 --- a/xfa/fde/cfde_txtedtpage.cpp +++ b/xfa/fde/cfde_txtedtpage.cpp @@ -296,7 +296,7 @@ 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_TxtPiece* pPiece = pBreak->GetBreakPiece(j); + const CFX_BreakPiece* pPiece = pBreak->GetBreakPiece(j); FDE_TEXTEDITPIECE TxtEdtPiece; FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE)); TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel; @@ -345,7 +345,7 @@ int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox, m_Pieces.push_back(TxtEdtPiece); for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) { m_CharWidths[TxtEdtPiece.nStart + k] = - pPiece->GetChar(k).m_iCharWidth; + pPiece->GetChar(k)->m_iCharWidth; } } fLinePos += fLineStep; diff --git a/xfa/fde/cfde_txtedtparag.cpp b/xfa/fde/cfde_txtedtparag.cpp index f7ba6d9631..79dcc2fbac 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_TxtPiece* Piece = pTxtBreak->GetBreakPiece(j); + const CFX_BreakPiece* Piece = pTxtBreak->GetBreakPiece(j); nTotal += Piece->GetLength(); } LineBaseArr.Add(nTotal); diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp index 0e8e91e8b1..02b1522823 100644 --- a/xfa/fde/tto/fde_textout.cpp +++ b/xfa/fde/tto/fde_textout.cpp @@ -245,7 +245,7 @@ bool CFDE_TextOut::RetrieveLineWidth(CFX_BreakType dwBreakStatus, FX_FLOAT fLineWidth = 0.0f; int32_t iCount = m_pTxtBreak->CountBreakPieces(); for (int32_t i = 0; i < iCount; i++) { - const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); fLineWidth += static_cast(pPiece->m_iWidth) / 20000.0f; fStartPos = std::min(fStartPos, static_cast(pPiece->m_iStartPos) / 20000.0f); @@ -387,10 +387,11 @@ 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_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); int32_t iPieceChars = pPiece->GetLength(); for (int32_t j = 0; j < iPieceChars; j++) { - (*pCharWidths)[iCharIndex] = std::max(pPiece->GetChar(j).m_iCharWidth, 0); + (*pCharWidths)[iCharIndex] = + std::max(pPiece->GetChar(j)->m_iCharWidth, 0); m_iEllipsisWidth += (*pCharWidths)[iCharIndex]; iCharIndex++; } @@ -468,14 +469,14 @@ 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_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); + const CFX_BreakPiece* pPiece = m_pTxtBreak->GetBreakPiece(i); int32_t iPieceChars = pPiece->GetLength(); int32_t iChar = iStartChar; int32_t iWidth = 0; int32_t j = 0; for (; j < iPieceChars; j++) { - const CFX_Char& pTC = pPiece->GetChar(j); - int32_t iCurCharWidth = pTC.m_iCharWidth > 0 ? pTC.m_iCharWidth : 0; + const CFX_Char* pTC = pPiece->GetChar(j); + int32_t iCurCharWidth = pTC->m_iCharWidth > 0 ? pTC->m_iCharWidth : 0; if (bSingleLine || !bLineWrap) { if (iLineWidth - iPieceWidths - iWidth < iCurCharWidth) { bNeedReload = true; diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h index fa4444822d..1519a81e8f 100644 --- a/xfa/fde/tto/fde_textout.h +++ b/xfa/fde/tto/fde_textout.h @@ -11,7 +11,7 @@ #include #include -#include "core/fxcrt/fx_ucd.h" +#include "core/fxcrt/cfx_char.h" #include "core/fxge/cfx_fxgedevice.h" #include "core/fxge/cfx_renderdevice.h" #include "core/fxge/fx_dib.h" diff --git a/xfa/fgas/layout/cfx_breakline.cpp b/xfa/fgas/layout/cfx_breakline.cpp new file mode 100644 index 0000000000..4e9d8ad5ae --- /dev/null +++ b/xfa/fgas/layout/cfx_breakline.cpp @@ -0,0 +1,55 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa/fgas/layout/cfx_breakline.h" + +#include "third_party/base/stl_util.h" + +CFX_BreakLine::CFX_BreakLine() : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {} + +CFX_BreakLine::~CFX_BreakLine() {} + +int32_t CFX_BreakLine::CountChars() const { + return pdfium::CollectionSize(m_LineChars); +} + +CFX_Char* CFX_BreakLine::GetChar(int32_t index) { + ASSERT(index >= 0 && index < pdfium::CollectionSize(m_LineChars)); + return &m_LineChars[index]; +} + +const CFX_Char* CFX_BreakLine::GetChar(int32_t index) const { + ASSERT(index >= 0 && index < pdfium::CollectionSize(m_LineChars)); + return &m_LineChars[index]; +} + +int32_t CFX_BreakLine::CountPieces() const { + return pdfium::CollectionSize(m_LinePieces); +} + +const CFX_BreakPiece* CFX_BreakLine::GetPiece(int32_t index) const { + ASSERT(index >= 0 && index < CountPieces()); + return &m_LinePieces[index]; +} + +void CFX_BreakLine::GetString(CFX_WideString& wsStr) const { + int32_t iCount = pdfium::CollectionSize(m_LineChars); + FX_WCHAR* pBuf = wsStr.GetBuffer(iCount); + for (int32_t i = 0; i < iCount; i++) + *pBuf++ = static_cast(m_LineChars[i].m_wCharCode); + wsStr.ReleaseBuffer(iCount); +} + +int32_t CFX_BreakLine::GetLineEnd() const { + return m_iStart + m_iWidth; +} + +void CFX_BreakLine::Clear() { + m_LineChars.clear(); + m_LinePieces.clear(); + m_iWidth = 0; + m_iArabicChars = 0; +} diff --git a/xfa/fgas/layout/cfx_breakline.h b/xfa/fgas/layout/cfx_breakline.h new file mode 100644 index 0000000000..138ee3104e --- /dev/null +++ b/xfa/fgas/layout/cfx_breakline.h @@ -0,0 +1,39 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef XFA_FGAS_LAYOUT_CFX_BREAKLINE_H_ +#define XFA_FGAS_LAYOUT_CFX_BREAKLINE_H_ + +#include + +#include "core/fxcrt/cfx_char.h" +#include "xfa/fgas/layout/cfx_breakpiece.h" + +class CFX_BreakLine { + public: + CFX_BreakLine(); + ~CFX_BreakLine(); + + int32_t CountChars() const; + CFX_Char* GetChar(int32_t index); + const CFX_Char* GetChar(int32_t index) const; + + int32_t CountPieces() const; + const CFX_BreakPiece* GetPiece(int32_t index) const; + + void GetString(CFX_WideString& wsStr) const; + int32_t GetLineEnd() const; + + void Clear(); + + std::vector m_LineChars; + std::vector m_LinePieces; + int32_t m_iStart; + int32_t m_iWidth; + int32_t m_iArabicChars; +}; + +#endif // XFA_FGAS_LAYOUT_CFX_BREAKLINE_H_ diff --git a/xfa/fgas/layout/cfx_breakpiece.cpp b/xfa/fgas/layout/cfx_breakpiece.cpp new file mode 100644 index 0000000000..d31c53f964 --- /dev/null +++ b/xfa/fgas/layout/cfx_breakpiece.cpp @@ -0,0 +1,53 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa/fgas/layout/cfx_breakpiece.h" + +CFX_BreakPiece::CFX_BreakPiece() + : m_dwStatus(CFX_BreakType::Piece), + m_iStartPos(0), + m_iWidth(-1), + m_iStartChar(0), + m_iChars(0), + m_iBidiLevel(0), + m_iBidiPos(0), + m_iFontSize(0), + m_iFontHeight(0), + m_iHorizontalScale(100), + m_iVerticalScale(100), + m_dwIdentity(0), + m_dwCharStyles(0), + m_pChars(nullptr), + m_pUserData(nullptr) {} + +CFX_BreakPiece::CFX_BreakPiece(const CFX_BreakPiece& other) = default; + +CFX_BreakPiece::~CFX_BreakPiece() = default; + +int32_t CFX_BreakPiece::GetEndPos() const { + return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth; +} + +CFX_Char* CFX_BreakPiece::GetChar(int32_t index) const { + ASSERT(index >= 0 && index < m_iChars && m_pChars); + return &(*m_pChars)[m_iStartChar + index]; +} + +CFX_WideString CFX_BreakPiece::GetString() const { + CFX_WideString ret; + ret.Reserve(m_iChars); + for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) + ret += static_cast((*m_pChars)[i].m_wCharCode); + return ret; +} + +std::vector CFX_BreakPiece::GetWidths() const { + std::vector ret; + ret.reserve(m_iChars); + for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) + ret.push_back((*m_pChars)[i].m_iCharWidth); + return ret; +} diff --git a/xfa/fgas/layout/cfx_breakpiece.h b/xfa/fgas/layout/cfx_breakpiece.h new file mode 100644 index 0000000000..64622b25c1 --- /dev/null +++ b/xfa/fgas/layout/cfx_breakpiece.h @@ -0,0 +1,46 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef XFA_FGAS_LAYOUT_CFX_BREAKPIECE_H_ +#define XFA_FGAS_LAYOUT_CFX_BREAKPIECE_H_ + +#include + +#include "core/fxcrt/cfx_char.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_string.h" + +class CFX_BreakPiece { + public: + CFX_BreakPiece(); + CFX_BreakPiece(const CFX_BreakPiece& other); + ~CFX_BreakPiece(); + + int32_t GetEndPos() const; + int32_t GetLength() const { return m_iChars; } + + CFX_Char* GetChar(int32_t index) const; + CFX_WideString GetString() const; + std::vector GetWidths() const; + + CFX_BreakType m_dwStatus; + int32_t m_iStartPos; + int32_t m_iWidth; + int32_t m_iStartChar; + int32_t m_iChars; + int32_t m_iBidiLevel; + int32_t m_iBidiPos; + int32_t m_iFontSize; + int32_t m_iFontHeight; + int32_t m_iHorizontalScale; + int32_t m_iVerticalScale; + uint32_t m_dwIdentity; + uint32_t m_dwCharStyles; + std::vector* m_pChars; // not owned. + CFX_RetainPtr m_pUserData; +}; + +#endif // XFA_FGAS_LAYOUT_CFX_BREAKPIECE_H_ diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp index c725dfb268..85edaf7f99 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.cpp +++ b/xfa/fgas/layout/fgas_rtfbreak.cpp @@ -148,20 +148,20 @@ void CFX_RTFBreak::SetBreakStatus() { if (iCount < 1) return; - CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); - if (tc.m_dwStatus == CFX_BreakType::None) - tc.m_dwStatus = CFX_BreakType::Piece; + CFX_Char* tc = m_pCurLine->GetChar(iCount - 1); + if (tc->m_dwStatus == CFX_BreakType::None) + tc->m_dwStatus = CFX_BreakType::Piece; } -CFX_RTFChar* CFX_RTFBreak::GetLastChar(int32_t index) const { - std::vector& tca = m_pCurLine->m_LineChars; +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_RTFChar* pTC = &tca[iStart--]; + CFX_Char* pTC = &tca[iStart--]; if (pTC->m_iCharWidth >= 0 || pTC->GetCharType() != FX_CHARTYPE_Combination) { if (--index < 0) @@ -197,7 +197,7 @@ CFX_BreakType CFX_RTFBreak::AppendChar(FX_WCHAR wch) { FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); m_pCurLine->m_LineChars.emplace_back(); - CFX_RTFChar* pCurChar = &m_pCurLine->m_LineChars.back(); + CFX_Char* pCurChar = &m_pCurLine->m_LineChars.back(); pCurChar->m_dwStatus = CFX_BreakType::None; pCurChar->m_wCharCode = wch; pCurChar->m_dwCharProps = dwProps; @@ -253,14 +253,14 @@ CFX_BreakType CFX_RTFBreak::AppendChar(FX_WCHAR wch) { return std::max(dwRet1, dwRet2); } -void CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar) { +void CFX_RTFBreak::AppendChar_Combination(CFX_Char* pCurChar) { int32_t iCharWidth = 0; if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth, false)) iCharWidth = 0; iCharWidth *= m_iFontSize; iCharWidth = iCharWidth * m_iHorizontalScale / 100; - CFX_RTFChar* pLastChar = GetLastChar(0); + CFX_Char* pLastChar = GetLastChar(0); if (pLastChar && pLastChar->GetCharType() > FX_CHARTYPE_Combination) iCharWidth = -iCharWidth; else @@ -271,7 +271,7 @@ void CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar) { m_pCurLine->m_iWidth += iCharWidth; } -void CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar) { +void CFX_RTFBreak::AppendChar_Tab(CFX_Char* pCurChar) { if (!(m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab)) return; @@ -286,7 +286,7 @@ void CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar) { iLineWidth += iCharWidth; } -CFX_BreakType CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar) { +CFX_BreakType CFX_RTFBreak::AppendChar_Control(CFX_Char* pCurChar) { CFX_BreakType dwRet2 = CFX_BreakType::None; switch (pCurChar->m_wCharCode) { case L'\v': @@ -310,8 +310,8 @@ CFX_BreakType CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar) { return dwRet2; } -CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar) { - CFX_RTFChar* pLastChar = nullptr; +CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_Char* pCurChar) { + CFX_Char* pLastChar = nullptr; int32_t iCharWidth = 0; FX_WCHAR wForm; bool bAlef = false; @@ -320,7 +320,7 @@ CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar) { pLastChar = GetLastChar(1); if (pLastChar) { m_pCurLine->m_iWidth -= pLastChar->m_iCharWidth; - CFX_RTFChar* pPrevChar = GetLastChar(2); + CFX_Char* pPrevChar = GetLastChar(2); wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); bAlef = (wForm == 0xFEFF && pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); @@ -355,7 +355,7 @@ CFX_BreakType CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar) { return CFX_BreakType::None; } -CFX_BreakType CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar) { +CFX_BreakType CFX_RTFBreak::AppendChar_Others(CFX_Char* pCurChar) { FX_CHARTYPE chartype = pCurChar->GetCharType(); FX_WCHAR wForm = pCurChar->m_wCharCode; int32_t iCharWidth = 0; @@ -398,13 +398,13 @@ CFX_BreakType CFX_RTFBreak::EndBreak(CFX_BreakType dwStatus) { if (iCount < 1) return CFX_BreakType::None; - CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); - tc.m_dwStatus = dwStatus; + CFX_Char* tc = m_pCurLine->GetChar(iCount - 1); + tc->m_dwStatus = dwStatus; if (dwStatus == CFX_BreakType::Piece) return dwStatus; m_iReadyLineIndex = m_pCurLine == &m_RTFLine[0] ? 0 : 1; - CFX_RTFLine* pNextLine = &m_RTFLine[1 - m_iReadyLineIndex]; + CFX_BreakLine* pNextLine = &m_RTFLine[1 - m_iReadyLineIndex]; bool bAllChars = m_iAlignment == CFX_RTFLineAlignment::Justified || m_iAlignment == CFX_RTFLineAlignment::Distributed; @@ -417,18 +417,18 @@ CFX_BreakType CFX_RTFBreak::EndBreak(CFX_BreakType dwStatus) { m_pCurLine = pNextLine; m_pCurLine->m_iStart = m_iBoundaryStart; - CFX_RTFChar* pTC = GetLastChar(0); + CFX_Char* pTC = GetLastChar(0); m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; return dwStatus; } -bool CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, +bool CFX_RTFBreak::EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars, CFX_BreakType dwStatus) { bool bDone = false; if (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { - const CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); - switch (tc.GetCharType()) { + const CFX_Char* tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); + switch (tc->GetCharType()) { case FX_CHARTYPE_Tab: case FX_CHARTYPE_Control: case FX_CHARTYPE_Space: @@ -448,15 +448,15 @@ bool CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, return false; } - const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.data(); - CFX_RTFPiece tp; + const CFX_Char* pCurChars = m_pCurLine->m_LineChars.data(); + CFX_BreakPiece tp; tp.m_pChars = &m_pCurLine->m_LineChars; bool bNew = true; uint32_t dwIdentity = static_cast(-1); int32_t iLast = m_pCurLine->CountChars() - 1; int32_t j = 0; for (int32_t i = 0; i <= iLast;) { - const CFX_RTFChar* pTC = pCurChars + i; + const CFX_Char* pTC = pCurChars + i; if (bNew) { tp.m_iStartChar = i; tp.m_iStartPos += tp.m_iWidth; @@ -494,8 +494,8 @@ bool CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, void CFX_RTFBreak::EndBreak_BidiLine(std::deque* tpos, CFX_BreakType dwStatus) { - CFX_RTFChar* pTC; - std::vector& chars = m_pCurLine->m_LineChars; + CFX_Char* pTC; + std::vector& chars = m_pCurLine->m_LineChars; int32_t iCount = m_pCurLine->CountChars(); if (!m_bPagination && m_pCurLine->m_iArabicChars > 0) { int32_t iBidiNum = 0; @@ -517,7 +517,7 @@ void CFX_RTFBreak::EndBreak_BidiLine(std::deque* tpos, } } - CFX_RTFPiece tp; + CFX_BreakPiece tp; tp.m_dwStatus = CFX_BreakType::Piece; tp.m_iStartPos = m_pCurLine->m_iStart; tp.m_pChars = &chars; @@ -577,7 +577,7 @@ void CFX_RTFBreak::EndBreak_BidiLine(std::deque* 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[it.index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[it.index]; ttp.m_iStartPos = iStartPos; iStartPos += ttp.m_iWidth; } @@ -590,23 +590,23 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque& tpos, int32_t iGapChars = 0; bool bFind = false; for (auto it = tpos.rbegin(); it != tpos.rend(); it++) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces[it->index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[it->index]; if (!bFind) iNetWidth = ttp.GetEndPos(); bool bArabic = FX_IsOdd(ttp.m_iBidiLevel); int32_t j = bArabic ? 0 : ttp.m_iChars - 1; while (j > -1 && j < ttp.m_iChars) { - const CFX_RTFChar& tc = ttp.GetChar(j); - if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) + const CFX_Char* tc = ttp.GetChar(j); + if (tc->m_nBreakType == FX_LBT_DIRECT_BRK) ++iGapChars; if (!bFind || !bAllChars) { - uint32_t dwCharType = tc.GetCharType(); + uint32_t dwCharType = tc->GetCharType(); if (dwCharType == FX_CHARTYPE_Space || dwCharType == FX_CHARTYPE_Control) { if (!bFind) { - int32_t iCharWidth = tc.m_iCharWidth; + int32_t iCharWidth = tc->m_iCharWidth; if (bAllChars && iCharWidth > 0) iNetWidth -= iCharWidth; } @@ -628,19 +628,19 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque& tpos, dwStatus != CFX_BreakType::Paragraph))) { int32_t iStart = -1; for (const auto& tpo : tpos) { - CFX_RTFPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; if (iStart < 0) iStart = ttp.m_iStartPos; else ttp.m_iStartPos = iStart; for (int32_t j = 0; j < ttp.m_iChars; ++j) { - CFX_RTFChar& tc = ttp.GetChar(j); - if (tc.m_nBreakType != FX_LBT_DIRECT_BRK || tc.m_iCharWidth < 0) + CFX_Char* tc = ttp.GetChar(j); + if (tc->m_nBreakType != FX_LBT_DIRECT_BRK || tc->m_iCharWidth < 0) continue; int32_t k = iOffset / iGapChars; - tc.m_iCharWidth += k; + tc->m_iCharWidth += k; ttp.m_iWidth += k; iOffset -= k; --iGapChars; @@ -660,7 +660,7 @@ void CFX_RTFBreak::EndBreak_Alignment(const std::deque& tpos, } } -int32_t CFX_RTFBreak::GetBreakPos(std::vector& tca, +int32_t CFX_RTFBreak::GetBreakPos(std::vector& tca, int32_t& iEndPos, bool bAllChars, bool bOnlyBrk) { @@ -682,8 +682,8 @@ int32_t CFX_RTFBreak::GetBreakPos(std::vector& tca, iBreakPos = iEndPos; } - CFX_RTFChar* pCharArray = tca.data(); - CFX_RTFChar* pCur = pCharArray + iLength; + CFX_Char* pCharArray = tca.data(); + CFX_Char* pCur = pCharArray + iLength; --iLength; if (bAllChars) pCur->m_nBreakType = FX_LBT_UNKNOWN; @@ -755,8 +755,8 @@ int32_t CFX_RTFBreak::GetBreakPos(std::vector& tca, return 0; } -void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, - CFX_RTFLine* pNextLine, +void CFX_RTFBreak::SplitTextLine(CFX_BreakLine* pCurLine, + CFX_BreakLine* pNextLine, bool bAllChars) { ASSERT(pCurLine && pNextLine); int32_t iCount = pCurLine->CountChars(); @@ -764,7 +764,7 @@ void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, return; int32_t iEndPos = pCurLine->GetLineEnd(); - std::vector& curChars = pCurLine->m_LineChars; + std::vector& curChars = pCurLine->m_LineChars; int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false); if (iCharPos < 0) iCharPos = 0; @@ -777,7 +777,7 @@ void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, } pNextLine->m_LineChars = - std::vector(curChars.begin() + iCharPos, curChars.end()); + std::vector(curChars.begin() + iCharPos, curChars.end()); curChars.erase(curChars.begin() + iCharPos, curChars.end()); pNextLine->m_iStart = pCurLine->m_iStart; pNextLine->m_iWidth = pCurLine->GetLineEnd() - iEndPos; @@ -799,11 +799,11 @@ int32_t CFX_RTFBreak::CountBreakPieces() const { : 0; } -const CFX_RTFPiece* CFX_RTFBreak::GetBreakPieceUnstable(int32_t index) const { +const CFX_BreakPiece* CFX_RTFBreak::GetBreakPieceUnstable(int32_t index) const { if (!HasRTFLine()) return nullptr; - const std::vector& pRTFPieces = + const std::vector& pRTFPieces = m_RTFLine[m_iReadyLineIndex].m_LinePieces; if (index < 0 || index >= pdfium::CollectionSize(pRTFPieces)) return nullptr; @@ -937,30 +937,6 @@ int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, return iCount; } -CFX_RTFPiece::CFX_RTFPiece() - : m_dwStatus(CFX_BreakType::Piece), - m_iStartPos(0), - m_iWidth(-1), - m_iStartChar(0), - m_iChars(0), - m_iBidiLevel(0), - m_iBidiPos(0), - m_iFontSize(0), - m_iFontHeight(0), - m_iHorizontalScale(100), - m_iVerticalScale(100), - m_dwIdentity(0), - m_pChars(nullptr), - m_pUserData(nullptr) {} - -CFX_RTFPiece::CFX_RTFPiece(const CFX_RTFPiece& other) = default; - -CFX_RTFPiece::~CFX_RTFPiece() {} - -CFX_RTFLine::CFX_RTFLine() : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {} - -CFX_RTFLine::~CFX_RTFLine() {} - FX_RTFTEXTOBJ::FX_RTFTEXTOBJ() : pFont(nullptr), pRect(nullptr), diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h index d71eeeef17..b3def63251 100644 --- a/xfa/fgas/layout/fgas_rtfbreak.h +++ b/xfa/fgas/layout/fgas_rtfbreak.h @@ -44,82 +44,6 @@ struct FX_RTFTEXTOBJ { int32_t iVerticalScale; }; -class CFX_RTFPiece { - public: - CFX_RTFPiece(); - CFX_RTFPiece(const CFX_RTFPiece& other); - ~CFX_RTFPiece(); - - int32_t GetEndPos() const { - return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth; - } - - CFX_RTFChar& GetChar(int32_t index) { - ASSERT(index > -1 && index < m_iChars && m_pChars); - return (*m_pChars)[m_iStartChar + index]; - } - - CFX_WideString GetString() const { - CFX_WideString ret; - ret.Reserve(m_iChars); - for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) - ret += static_cast((*m_pChars)[i].m_wCharCode); - return ret; - } - - std::vector GetWidths() const { - std::vector ret; - ret.reserve(m_iChars); - for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) - ret.push_back((*m_pChars)[i].m_iCharWidth); - return ret; - } - - CFX_BreakType m_dwStatus; - int32_t m_iStartPos; - int32_t m_iWidth; - int32_t m_iStartChar; - int32_t m_iChars; - int32_t m_iBidiLevel; - int32_t m_iBidiPos; - int32_t m_iFontSize; - int32_t m_iFontHeight; - int32_t m_iHorizontalScale; - int32_t m_iVerticalScale; - uint32_t m_dwIdentity; - std::vector* m_pChars; // not owned. - CFX_RetainPtr m_pUserData; -}; - -class CFX_RTFLine { - public: - CFX_RTFLine(); - ~CFX_RTFLine(); - - int32_t CountChars() const { - return pdfium::CollectionSize(m_LineChars); - } - - CFX_RTFChar& GetChar(int32_t index) { - ASSERT(index >= 0 && index < pdfium::CollectionSize(m_LineChars)); - return m_LineChars[index]; - } - - int32_t GetLineEnd() const { return m_iStart + m_iWidth; } - void Clear() { - m_LineChars.clear(); - m_LinePieces.clear(); - m_iWidth = 0; - m_iArabicChars = 0; - } - - std::vector m_LineChars; - std::vector m_LinePieces; - int32_t m_iStart; - int32_t m_iWidth; - int32_t m_iArabicChars; -}; - class CFX_RTFBreak { public: explicit CFX_RTFBreak(uint32_t dwLayoutStyles); @@ -141,7 +65,7 @@ class CFX_RTFBreak { CFX_BreakType EndBreak(CFX_BreakType dwStatus); int32_t CountBreakPieces() const; - const CFX_RTFPiece* GetBreakPieceUnstable(int32_t index) const; + const CFX_BreakPiece* GetBreakPieceUnstable(int32_t index) const; void ClearBreakPieces(); void Reset(); @@ -152,30 +76,30 @@ class CFX_RTFBreak { CFX_BreakType AppendChar(FX_WCHAR wch); - CFX_RTFLine* GetCurrentLineForTesting() const { return m_pCurLine; } + CFX_BreakLine* GetCurrentLineForTesting() const { return m_pCurLine; } private: - void AppendChar_Combination(CFX_RTFChar* pCurChar); - void AppendChar_Tab(CFX_RTFChar* pCurChar); - CFX_BreakType AppendChar_Control(CFX_RTFChar* pCurChar); - CFX_BreakType AppendChar_Arabic(CFX_RTFChar* pCurChar); - CFX_BreakType AppendChar_Others(CFX_RTFChar* pCurChar); + void AppendChar_Combination(CFX_Char* pCurChar); + void AppendChar_Tab(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Control(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Others(CFX_Char* pCurChar); void FontChanged(); void SetBreakStatus(); - CFX_RTFChar* GetLastChar(int32_t index) const; + 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; - int32_t GetBreakPos(std::vector& tca, + int32_t GetBreakPos(std::vector& tca, int32_t& iEndPos, bool bAllChars, bool bOnlyBrk); - void SplitTextLine(CFX_RTFLine* pCurLine, - CFX_RTFLine* pNextLine, + void SplitTextLine(CFX_BreakLine* pCurLine, + CFX_BreakLine* pNextLine, bool bAllChars); - bool EndBreak_SplitLine(CFX_RTFLine* pNextLine, + bool EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars, CFX_BreakType dwStatus); void EndBreak_BidiLine(std::deque* tpos, CFX_BreakType dwStatus); @@ -202,8 +126,8 @@ class CFX_RTFBreak { CFX_RetainPtr m_pUserData; FX_CHARTYPE m_eCharType; uint32_t m_dwIdentity; - CFX_RTFLine m_RTFLine[2]; - CFX_RTFLine* m_pCurLine; + CFX_BreakLine m_RTFLine[2]; + CFX_BreakLine* m_pCurLine; int32_t m_iTolerance; int8_t m_iReadyLineIndex; }; diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp index e168613882..9343f94cc6 100644 --- a/xfa/fgas/layout/fgas_textbreak.cpp +++ b/xfa/fgas/layout/fgas_textbreak.cpp @@ -17,7 +17,7 @@ namespace { typedef CFX_BreakType (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)( - CFX_TxtChar* pCurChar); + CFX_Char* pCurChar); const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = { &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Tab, &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Control, @@ -156,7 +156,7 @@ void CFX_TxtBreak::SetBreakStatus() { if (iCount < 1) return; - CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); + CFX_Char* pTC = m_pCurLine->GetChar(iCount - 1); if (pTC->m_dwStatus == CFX_BreakType::None) pTC->m_dwStatus = CFX_BreakType::Piece; } @@ -175,15 +175,15 @@ void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); } -CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const { - std::vector& ca = m_pCurLine->m_LineChars; +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_TxtChar* pTC = &ca[iStart--]; + CFX_Char* pTC = &ca[iStart--]; if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) continue; if (--index < 0) @@ -202,13 +202,12 @@ void CFX_TxtBreak::ResetArabicContext() { ResetContextCharStyles(); } -void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, - uint32_t dwProps) { +void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, uint32_t dwProps) { pCurChar->m_dwStatus = CFX_BreakType::None; pCurChar->m_dwCharStyles = m_dwContextCharStyles; } -CFX_BreakType CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar) { +CFX_BreakType CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar) { FX_WCHAR wch = pCurChar->m_wCharCode; FX_WCHAR wForm; int32_t iCharWidth = 0; @@ -217,7 +216,7 @@ CFX_BreakType CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar) { iCharWidth = m_iCombWidth; } else { wForm = wch; - CFX_TxtChar* pLastChar = GetLastChar(0, false); + CFX_Char* pLastChar = GetLastChar(0, false); if (pLastChar && (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { bool bShadda = false; @@ -249,12 +248,12 @@ CFX_BreakType CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar) { return CFX_BreakType::None; } -CFX_BreakType CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar) { +CFX_BreakType CFX_TxtBreak::AppendChar_Tab(CFX_Char* pCurChar) { m_eCharType = FX_CHARTYPE_Tab; return CFX_BreakType::None; } -CFX_BreakType CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar) { +CFX_BreakType CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar) { m_eCharType = FX_CHARTYPE_Control; CFX_BreakType dwRet = CFX_BreakType::None; if (!m_bSingleLine) { @@ -281,12 +280,12 @@ CFX_BreakType CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar) { return dwRet; } -CFX_BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar) { +CFX_BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar) { FX_CHARTYPE chartype = pCurChar->GetCharType(); int32_t& iLineWidth = m_pCurLine->m_iWidth; FX_WCHAR wForm; int32_t iCharWidth = 0; - CFX_TxtChar* pLastChar = nullptr; + CFX_Char* pLastChar = nullptr; bool bAlef = false; if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && m_eCharType <= FX_CHARTYPE_ArabicDistortion) { @@ -335,7 +334,7 @@ CFX_BreakType CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar) { return CFX_BreakType::None; } -CFX_BreakType CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar) { +CFX_BreakType CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar) { FX_CHARTYPE chartype = pCurChar->GetCharType(); int32_t& iLineWidth = m_pCurLine->m_iWidth; int32_t iCharWidth = 0; @@ -369,7 +368,7 @@ CFX_BreakType CFX_TxtBreak::AppendChar(FX_WCHAR wch) { FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); m_pCurLine->m_LineChars.emplace_back(); - CFX_TxtChar* pCurChar = &m_pCurLine->m_LineChars.back(); + CFX_Char* pCurChar = &m_pCurLine->m_LineChars.back(); pCurChar->m_wCharCode = static_cast(wch); pCurChar->m_dwCharProps = dwProps; pCurChar->m_dwCharStyles = 0; @@ -401,12 +400,13 @@ CFX_BreakType CFX_TxtBreak::AppendChar(FX_WCHAR wch) { return std::max(dwRet1, dwRet2); } -bool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, bool bAllChars) { +bool CFX_TxtBreak::EndBreak_SplitLine(CFX_BreakLine* pNextLine, + bool bAllChars) { int32_t iCount = m_pCurLine->CountChars(); bool bDone = false; - CFX_TxtChar* pTC; + CFX_Char* pTC; if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { - pTC = m_pCurLine->GetCharPtr(iCount - 1); + pTC = m_pCurLine->GetChar(iCount - 1); switch (pTC->GetCharType()) { case FX_CHARTYPE_Tab: case FX_CHARTYPE_Control: @@ -420,7 +420,7 @@ bool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, bool bAllChars) { } iCount = m_pCurLine->CountChars(); - CFX_TxtPiece tp; + CFX_BreakPiece tp; if (bAllChars && !bDone) { int32_t iEndPos = m_pCurLine->m_iWidth; GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, true); @@ -430,12 +430,12 @@ bool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, bool bAllChars) { void CFX_TxtBreak::EndBreak_BidiLine(std::deque* tpos, CFX_BreakType dwStatus) { - CFX_TxtPiece tp; + CFX_BreakPiece tp; FX_TPO tpo; - CFX_TxtChar* pTC; + CFX_Char* pTC; int32_t i; int32_t j; - std::vector& chars = m_pCurLine->m_LineChars; + std::vector& chars = m_pCurLine->m_LineChars; int32_t iCount = m_pCurLine->CountChars(); bool bDone = m_pCurLine->m_iArabicChars > 0; if (bDone) { @@ -511,7 +511,7 @@ void CFX_TxtBreak::EndBreak_BidiLine(std::deque* tpos, int32_t iStartPos = 0; for (i = 0; i <= j; i++) { tpo = (*tpos)[i]; - CFX_TxtPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; ttp.m_iStartPos = iStartPos; iStartPos += ttp.m_iWidth; } @@ -541,21 +541,21 @@ void CFX_TxtBreak::EndBreak_Alignment(const std::deque& tpos, int32_t iGapChars = 0; bool bFind = false; for (auto it = tpos.rbegin(); it != tpos.rend(); ++it) { - CFX_TxtPiece& ttp = m_pCurLine->m_LinePieces[it->index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[it->index]; if (!bFind) iNetWidth = ttp.GetEndPos(); bool bArabic = FX_IsOdd(ttp.m_iBidiLevel); int32_t j = bArabic ? 0 : ttp.m_iChars - 1; while (j > -1 && j < ttp.m_iChars) { - const CFX_TxtChar& pTC = ttp.GetChar(j); - if (pTC.m_nBreakType == FX_LBT_DIRECT_BRK) + const CFX_Char* pTC = ttp.GetChar(j); + if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) iGapChars++; if (!bFind || !bAllChars) { - FX_CHARTYPE chartype = pTC.GetCharType(); + FX_CHARTYPE chartype = pTC->GetCharType(); if (chartype == FX_CHARTYPE_Space || chartype == FX_CHARTYPE_Control) { - if (!bFind && bAllChars && pTC.m_iCharWidth > 0) - iNetWidth -= pTC.m_iCharWidth; + if (!bFind && bAllChars && pTC->m_iCharWidth > 0) + iNetWidth -= pTC->m_iCharWidth; } else { bFind = true; if (!bAllChars) @@ -573,19 +573,19 @@ void CFX_TxtBreak::EndBreak_Alignment(const std::deque& tpos, dwStatus != CFX_BreakType::Paragraph) { int32_t iStart = -1; for (auto& tpo : tpos) { - CFX_TxtPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; + CFX_BreakPiece& ttp = m_pCurLine->m_LinePieces[tpo.index]; if (iStart < -1) iStart = ttp.m_iStartPos; else ttp.m_iStartPos = iStart; for (int32_t j = 0; j < ttp.m_iChars; j++) { - CFX_TxtChar& pTC = ttp.GetChar(j); - if (pTC.m_nBreakType != FX_LBT_DIRECT_BRK || pTC.m_iCharWidth < 0) + CFX_Char* pTC = ttp.GetChar(j); + if (pTC->m_nBreakType != FX_LBT_DIRECT_BRK || pTC->m_iCharWidth < 0) continue; int32_t k = iOffset / iGapChars; - pTC.m_iCharWidth += k; + pTC->m_iCharWidth += k; ttp.m_iWidth += k; iOffset -= k; iGapChars--; @@ -629,12 +629,12 @@ CFX_BreakType CFX_TxtBreak::EndBreak(CFX_BreakType dwStatus) { if (iCount < 1) return CFX_BreakType::None; - m_pCurLine->GetCharPtr(iCount - 1)->m_dwStatus = dwStatus; + m_pCurLine->GetChar(iCount - 1)->m_dwStatus = dwStatus; if (dwStatus == CFX_BreakType::Piece) return dwStatus; m_iReadyLineIndex = m_pCurLine == &m_TxtLine[0] ? 0 : 1; - CFX_TxtLine* pNextLine = &m_TxtLine[1 - m_iReadyLineIndex]; + CFX_BreakLine* pNextLine = &m_TxtLine[1 - m_iReadyLineIndex]; bool bAllChars = m_iCurAlignment > CFX_TxtLineAlignment_Right; if (!EndBreak_SplitLine(pNextLine, bAllChars)) { std::deque tpos; @@ -653,7 +653,7 @@ CFX_BreakType CFX_TxtBreak::EndBreak(CFX_BreakType dwStatus) { return dwStatus; } -int32_t CFX_TxtBreak::GetBreakPos(std::vector& ca, +int32_t CFX_TxtBreak::GetBreakPos(std::vector& ca, int32_t& iEndPos, bool bAllChars, bool bOnlyBrk) { @@ -746,8 +746,8 @@ int32_t CFX_TxtBreak::GetBreakPos(std::vector& ca, return 0; } -void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, - CFX_TxtLine* pNextLine, +void CFX_TxtBreak::SplitTextLine(CFX_BreakLine* pCurLine, + CFX_BreakLine* pNextLine, bool bAllChars) { ASSERT(pCurLine && pNextLine); int32_t iCount = pCurLine->CountChars(); @@ -755,7 +755,7 @@ void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, return; int32_t iEndPos = pCurLine->m_iWidth; - std::vector& curChars = pCurLine->m_LineChars; + std::vector& curChars = pCurLine->m_LineChars; int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false); if (iCharPos < 0) iCharPos = 0; @@ -769,10 +769,10 @@ void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, } pNextLine->m_LineChars = - std::vector(curChars.begin() + iCharPos, curChars.end()); + std::vector(curChars.begin() + iCharPos, curChars.end()); curChars.erase(curChars.begin() + iCharPos, curChars.end()); pCurLine->m_iWidth = iEndPos; - CFX_TxtChar* pTC = &curChars[iCharPos - 1]; + CFX_Char* pTC = &curChars[iCharPos - 1]; pTC->m_nBreakType = FX_LBT_UNKNOWN; iCount = pdfium::CollectionSize(pNextLine->m_LineChars); int32_t iWidth = 0; @@ -793,7 +793,7 @@ int32_t CFX_TxtBreak::CountBreakPieces() const { : 0; } -const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { +const CFX_BreakPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { if (!HasTxtLine()) return nullptr; if (index < 0 || @@ -1194,24 +1194,3 @@ FX_TXTRUN::FX_TXTRUN() FX_TXTRUN::~FX_TXTRUN() {} FX_TXTRUN::FX_TXTRUN(const FX_TXTRUN& other) = default; - -CFX_TxtPiece::CFX_TxtPiece() - : m_dwStatus(CFX_BreakType::Piece), - m_iStartPos(0), - m_iWidth(-1), - m_iStartChar(0), - m_iChars(0), - m_iBidiLevel(0), - m_iBidiPos(0), - m_iHorizontalScale(100), - m_iVerticalScale(100), - m_dwCharStyles(0), - m_pChars(nullptr) {} - -CFX_TxtPiece::CFX_TxtPiece(const CFX_TxtPiece& other) = default; - -CFX_TxtPiece::~CFX_TxtPiece() = default; - -CFX_TxtLine::CFX_TxtLine() : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {} - -CFX_TxtLine::~CFX_TxtLine() {} diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h index c023955aab..9aa576f380 100644 --- a/xfa/fgas/layout/fgas_textbreak.h +++ b/xfa/fgas/layout/fgas_textbreak.h @@ -11,15 +11,13 @@ #include #include -#include "core/fxcrt/fx_ucd.h" +#include "core/fxcrt/cfx_char.h" #include "core/fxge/cfx_renderdevice.h" #include "third_party/base/stl_util.h" #include "xfa/fde/cfde_txtedtpage.h" +#include "xfa/fgas/layout/cfx_breakline.h" -class CFX_Char; class CFGAS_GEFont; -class CFX_TxtChar; -class CFX_TxtPiece; struct FDE_TEXTEDITPIECE; #define FX_TXTLAYOUTSTYLE_SingleLine 0x0200 @@ -67,93 +65,6 @@ struct FX_TXTRUN { bool bSkipSpace; }; -class CFX_TxtPiece { - public: - CFX_TxtPiece(); - CFX_TxtPiece(const CFX_TxtPiece& other); - ~CFX_TxtPiece(); - - int32_t GetEndPos() const { - return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth; - } - int32_t GetLength() const { return m_iChars; } - - CFX_TxtChar& GetChar(int32_t index) const { - ASSERT(index > -1 && index < m_iChars && m_pChars); - return (*m_pChars)[m_iStartChar + index]; - } - - CFX_WideString GetString() const { - CFX_WideString ret; - ret.Reserve(m_iChars); - for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++) - ret += static_cast((*m_pChars)[i].m_wCharCode); - return ret; - } - - CFX_BreakType m_dwStatus; - int32_t m_iStartPos; - int32_t m_iWidth; - int32_t m_iStartChar; - int32_t m_iChars; - int32_t m_iBidiLevel; - int32_t m_iBidiPos; - int32_t m_iHorizontalScale; - int32_t m_iVerticalScale; - uint32_t m_dwCharStyles; - std::vector* m_pChars; -}; - -class CFX_TxtLine { - public: - CFX_TxtLine(); - ~CFX_TxtLine(); - - int32_t CountChars() const { - return pdfium::CollectionSize(m_LineChars); - } - - CFX_TxtChar* GetCharPtr(int32_t index) { - ASSERT(index >= 0 && index < pdfium::CollectionSize(m_LineChars)); - return &m_LineChars[index]; - } - - const CFX_TxtChar* GetCharPtr(int32_t index) const { - ASSERT(index >= 0 && index < pdfium::CollectionSize(m_LineChars)); - return &m_LineChars[index]; - } - - int32_t CountPieces() const { - return pdfium::CollectionSize(m_LinePieces); - } - - const CFX_TxtPiece* GetPiecePtr(int32_t index) const { - ASSERT(index >= 0 && index < CountPieces()); - return &m_LinePieces[index]; - } - - void GetString(CFX_WideString& wsStr) const { - int32_t iCount = pdfium::CollectionSize(m_LineChars); - FX_WCHAR* pBuf = wsStr.GetBuffer(iCount); - for (int32_t i = 0; i < iCount; i++) - *pBuf++ = static_cast(m_LineChars[i].m_wCharCode); - wsStr.ReleaseBuffer(iCount); - } - - void Clear() { - m_LineChars.clear(); - m_LinePieces.clear(); - m_iWidth = 0; - m_iArabicChars = 0; - } - - std::vector m_LineChars; - std::vector m_LinePieces; - int32_t m_iStart; - int32_t m_iWidth; - int32_t m_iArabicChars; -}; - class CFX_TxtBreak { public: CFX_TxtBreak(); @@ -174,7 +85,7 @@ class CFX_TxtBreak { void SetCombWidth(FX_FLOAT fCombWidth); CFX_BreakType EndBreak(CFX_BreakType dwStatus); int32_t CountBreakPieces() const; - const CFX_TxtPiece* GetBreakPiece(int32_t index) const; + const CFX_BreakPiece* GetBreakPiece(int32_t index) const; void ClearBreakPieces(); void Reset(); int32_t GetDisplayPos(const FX_TXTRUN* pTxtRun, @@ -183,33 +94,33 @@ class CFX_TxtBreak { CFX_WideString* pWSForms = nullptr) const; std::vector GetCharRects(const FX_TXTRUN* pTxtRun, bool bCharBBox = false) const; - void AppendChar_PageLoad(CFX_TxtChar* pCurChar, uint32_t dwProps); + void AppendChar_PageLoad(CFX_Char* pCurChar, uint32_t dwProps); CFX_BreakType AppendChar(FX_WCHAR wch); - CFX_BreakType AppendChar_Combination(CFX_TxtChar* pCurChar); - CFX_BreakType AppendChar_Tab(CFX_TxtChar* pCurChar); - CFX_BreakType AppendChar_Control(CFX_TxtChar* pCurChar); - CFX_BreakType AppendChar_Arabic(CFX_TxtChar* pCurChar); - CFX_BreakType AppendChar_Others(CFX_TxtChar* pCurChar); + CFX_BreakType AppendChar_Combination(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Tab(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Control(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar); + CFX_BreakType AppendChar_Others(CFX_Char* pCurChar); private: void FontChanged(); void SetBreakStatus(); - CFX_TxtChar* GetLastChar(int32_t index, bool bOmitChar = true) const; + 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 ResetArabicContext(); void ResetContextCharStyles(); - bool EndBreak_SplitLine(CFX_TxtLine* pNextLine, bool bAllChars); + bool EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars); void EndBreak_BidiLine(std::deque* tpos, CFX_BreakType dwStatus); void EndBreak_Alignment(const std::deque& tpos, bool bAllChars, CFX_BreakType dwStatus); - int32_t GetBreakPos(std::vector& ca, + int32_t GetBreakPos(std::vector& ca, int32_t& iEndPos, bool bAllChars = false, bool bOnlyBrk = false); - void SplitTextLine(CFX_TxtLine* pCurLine, - CFX_TxtLine* pNextLine, + void SplitTextLine(CFX_BreakLine* pCurLine, + CFX_BreakLine* pNextLine, bool bAllChars = false); int32_t m_iLineWidth; @@ -230,8 +141,8 @@ class CFX_TxtBreak { int32_t m_iCombWidth; FX_CHARTYPE m_eCharType; int32_t m_iCurAlignment; - CFX_TxtLine m_TxtLine[2]; - CFX_TxtLine* m_pCurLine; + CFX_BreakLine m_TxtLine[2]; + CFX_BreakLine* m_pCurLine; int32_t m_iTolerance; int32_t m_iHorScale; int32_t m_iCharSpace; diff --git a/xfa/fxfa/app/cxfa_textlayout.cpp b/xfa/fxfa/app/cxfa_textlayout.cpp index 3c2c37dcff..c2d2a9ef6d 100644 --- a/xfa/fxfa/app/cxfa_textlayout.cpp +++ b/xfa/fxfa/app/cxfa_textlayout.cpp @@ -1032,7 +1032,7 @@ void CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus, FX_FLOAT fLineStep = 0, fBaseLine = 0; int32_t i = 0; for (i = 0; i < iPieces; i++) { - const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); + const CFX_BreakPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); CXFA_TextUserData* pUserData = static_cast(pPiece->m_pUserData.Get()); if (pUserData) @@ -1087,7 +1087,7 @@ void CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus, FX_FLOAT fLineStep = 0; FX_FLOAT fLineWidth = 0; for (int32_t i = 0; i < iPieces; i++) { - const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); + const CFX_BreakPiece* pPiece = m_pBreak->GetBreakPieceUnstable(i); CXFA_TextUserData* pUserData = static_cast(pPiece->m_pUserData.Get()); if (pUserData) -- cgit v1.2.3