diff options
-rw-r--r-- | xfa/fxfa/cxfa_textlayout.cpp | 72 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textlayout.h | 21 |
2 files changed, 47 insertions, 46 deletions
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp index 49cb13a714..6e91a59864 100644 --- a/xfa/fxfa/cxfa_textlayout.cpp +++ b/xfa/fxfa/cxfa_textlayout.cpp @@ -21,6 +21,7 @@ #include "third_party/base/stl_util.h" #include "xfa/fde/cfde_textout.h" #include "xfa/fgas/font/cfgas_gefont.h" +#include "xfa/fgas/layout/cfx_rtfbreak.h" #include "xfa/fxfa/cxfa_linkuserdata.h" #include "xfa/fxfa/cxfa_loadercontext.h" #include "xfa/fxfa/cxfa_pieceline.h" @@ -35,16 +36,37 @@ #define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001 +namespace { + +void ProcessText(WideString* pText) { + int32_t iLen = pText->GetLength(); + if (iLen == 0) + return; + + int32_t iTrimLeft = 0; + { + // Span's lifetime must end before ReleaseBuffer() below. + pdfium::span<wchar_t> psz = pText->GetBuffer(iLen); + wchar_t wPrev = 0; + for (int32_t i = 0; i < iLen; i++) { + wchar_t wch = psz[i]; + if (wch < 0x20) + wch = 0x20; + if (wch == 0x20 && wPrev == 0x20) + continue; + + wPrev = wch; + psz[iTrimLeft++] = wch; + } + } + pText->ReleaseBuffer(iTrimLeft); +} + +} // namespace + CXFA_TextLayout::CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider) - : m_bHasBlock(false), - m_pDoc(doc), - m_pTextProvider(pTextProvider), - m_pTextDataNode(nullptr), - m_bRichText(false), - m_iLines(0), - m_fMaxWidth(0), - m_bBlockContinue(true) { + : m_pDoc(doc), m_pTextProvider(pTextProvider) { ASSERT(m_pTextProvider); } @@ -360,7 +382,7 @@ float CXFA_TextLayout::DoLayout(int32_t iBlockIndex, (m_pLoader->m_BlocksHeight[iBlockIndex * 2] == iBlockIndex)) { m_pLoader->m_BlocksHeight[iBlockIndex * 2 + 1] = fCalcHeight; } else { - m_pLoader->m_BlocksHeight.push_back((float)iBlockIndex); + m_pLoader->m_BlocksHeight.push_back(iBlockIndex); m_pLoader->m_BlocksHeight.push_back(fCalcHeight); } } @@ -783,7 +805,7 @@ bool CXFA_TextLayout::LoadRichText( int32_t iLength = wsText.GetLength(); if (iLength > 0 && bContentNode && !bSpaceRun) - ProcessText(wsText); + ProcessText(&wsText); if (m_pLoader) { if (wsText.GetLength() > 0 && @@ -912,30 +934,6 @@ bool CXFA_TextLayout::IsEnd(bool bSavePieces) { return false; } -void CXFA_TextLayout::ProcessText(WideString& wsText) { - int32_t iLen = wsText.GetLength(); - if (iLen == 0) - return; - - int32_t iTrimLeft = 0; - { - // Span's lifetime must end before ReleaseBuffer() below. - pdfium::span<wchar_t> psz = wsText.GetBuffer(iLen); - wchar_t wPrev = 0; - for (int32_t i = 0; i < iLen; i++) { - wchar_t wch = psz[i]; - if (wch < 0x20) - wch = 0x20; - if (wch == 0x20 && wPrev == 0x20) - continue; - - wPrev = wch; - psz[iTrimLeft++] = wch; - } - } - wsText.ReleaseBuffer(iTrimLeft); -} - void CXFA_TextLayout::EndBreak(CFX_BreakType dwStatus, float* pLinePos, bool bSavePieces) { @@ -1041,7 +1039,8 @@ void CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus, pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle.Get()); pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; - pTP->rtPiece.height = (float)pPiece->m_iFontSize * fVerScale / 20.0f; + pTP->rtPiece.height = + static_cast<float>(pPiece->m_iFontSize) * fVerScale / 20.0f; float fBaseLineTemp = m_textParser.GetBaseline(m_pTextProvider, pStyle.Get()); pTP->rtPiece.top = fBaseLineTemp; @@ -1079,7 +1078,8 @@ void CXFA_TextLayout::AppendTextLine(CFX_BreakType dwStatus, m_pTextProvider, pStyle.Get(), m_iLines == 0, fVerScale); if (fBaseLine > 0) { float fLineHeightTmp = - fBaseLine + (float)pPiece->m_iFontSize * fVerScale / 20.0f; + fBaseLine + + static_cast<float>(pPiece->m_iFontSize) * fVerScale / 20.0f; if (fLineHeight < fLineHeightTmp) { fLineHeight = fLineHeightTmp; } diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h index 9baf5ec76d..09740b3e6b 100644 --- a/xfa/fxfa/cxfa_textlayout.h +++ b/xfa/fxfa/cxfa_textlayout.h @@ -10,10 +10,10 @@ #include <memory> #include <vector> +#include "core/fxcrt/cfx_char.h" #include "core/fxcrt/css/cfx_css.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_string.h" -#include "xfa/fgas/layout/cfx_rtfbreak.h" #include "xfa/fxfa/cxfa_textparser.h" class CFDE_RenderDevice; @@ -28,6 +28,8 @@ class CXFA_PieceLine; class CXFA_TextPiece; class CXFA_TextProvider; class CXFA_TextTabstopsContext; +class FXTEXT_CHARPOS; +struct FX_RTFTEXTOBJ; class CXFA_TextLayout { public: @@ -54,7 +56,7 @@ class CXFA_TextLayout { return &m_pieceLines; } - bool m_bHasBlock; + bool m_bHasBlock = false; std::vector<int32_t> m_Blocks; private: @@ -91,7 +93,6 @@ class CXFA_TextLayout { bool bEndBreak); void EndBreak(CFX_BreakType dwStatus, float* pLinePos, bool bDefault); bool IsEnd(bool bSavePieces); - void ProcessText(WideString& wsText); void UpdateAlign(float fHeight, float fBottom); void RenderString(CFX_RenderDevice* pDevice, CXFA_PieceLine* pPieceLine, @@ -109,18 +110,18 @@ class CXFA_TextLayout { bool Layout(int32_t iBlock); int32_t CountBlocks() const; - UnownedPtr<CXFA_FFDoc> m_pDoc; - CXFA_TextProvider* m_pTextProvider; // Raw, TextProvider owned by tree node. - CXFA_Node* m_pTextDataNode; // Raw, this class owned by tree node. - bool m_bRichText; + bool m_bRichText = false; + bool m_bBlockContinue = true; + int32_t m_iLines = 0; + float m_fMaxWidth = 0; + UnownedPtr<CXFA_FFDoc> const m_pDoc; + CXFA_TextProvider* const m_pTextProvider; // Raw, owned by tree node. + CXFA_Node* m_pTextDataNode = nullptr; // Raw, owned by tree node. std::unique_ptr<CFX_RTFBreak> m_pBreak; std::unique_ptr<CXFA_LoaderContext> m_pLoader; - int32_t m_iLines; - float m_fMaxWidth; CXFA_TextParser m_textParser; std::vector<std::unique_ptr<CXFA_PieceLine>> m_pieceLines; std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext; - bool m_bBlockContinue; }; #endif // XFA_FXFA_CXFA_TEXTLAYOUT_H_ |