1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FDE_CFDE_TEXTOUT_H_ 8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FDE_CFDE_TEXTOUT_H_ 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker #include <deque> 11*3ac0a46fSAndroid Build Coastguard Worker #include <memory> 12*3ac0a46fSAndroid Build Coastguard Worker #include <vector> 13*3ac0a46fSAndroid Build Coastguard Worker 14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/retain_ptr.h" 15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h" 16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/fx_dib.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/span.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fde/cfde_data.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/layout/cfgas_break.h" 20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/layout/cfgas_char.h" 21*3ac0a46fSAndroid Build Coastguard Worker 22*3ac0a46fSAndroid Build Coastguard Worker class CFGAS_GEFont; 23*3ac0a46fSAndroid Build Coastguard Worker class CFGAS_TxtBreak; 24*3ac0a46fSAndroid Build Coastguard Worker class CFX_RenderDevice; 25*3ac0a46fSAndroid Build Coastguard Worker class TextCharPos; 26*3ac0a46fSAndroid Build Coastguard Worker 27*3ac0a46fSAndroid Build Coastguard Worker class CFDE_TextOut { 28*3ac0a46fSAndroid Build Coastguard Worker public: 29*3ac0a46fSAndroid Build Coastguard Worker static bool DrawString(CFX_RenderDevice* device, 30*3ac0a46fSAndroid Build Coastguard Worker FX_ARGB color, 31*3ac0a46fSAndroid Build Coastguard Worker const RetainPtr<CFGAS_GEFont>& pFont, 32*3ac0a46fSAndroid Build Coastguard Worker pdfium::span<TextCharPos> pCharPos, 33*3ac0a46fSAndroid Build Coastguard Worker float fFontSize, 34*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& matrix); 35*3ac0a46fSAndroid Build Coastguard Worker 36*3ac0a46fSAndroid Build Coastguard Worker CFDE_TextOut(); 37*3ac0a46fSAndroid Build Coastguard Worker ~CFDE_TextOut(); 38*3ac0a46fSAndroid Build Coastguard Worker 39*3ac0a46fSAndroid Build Coastguard Worker void SetFont(RetainPtr<CFGAS_GEFont> pFont); 40*3ac0a46fSAndroid Build Coastguard Worker void SetFontSize(float fFontSize); SetTextColor(FX_ARGB color)41*3ac0a46fSAndroid Build Coastguard Worker void SetTextColor(FX_ARGB color) { m_TxtColor = color; } 42*3ac0a46fSAndroid Build Coastguard Worker void SetStyles(const FDE_TextStyle& dwStyles); 43*3ac0a46fSAndroid Build Coastguard Worker void SetAlignment(FDE_TextAlignment iAlignment); 44*3ac0a46fSAndroid Build Coastguard Worker void SetLineSpace(float fLineSpace); SetMatrix(const CFX_Matrix & matrix)45*3ac0a46fSAndroid Build Coastguard Worker void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; } 46*3ac0a46fSAndroid Build Coastguard Worker void SetLineBreakTolerance(float fTolerance); 47*3ac0a46fSAndroid Build Coastguard Worker 48*3ac0a46fSAndroid Build Coastguard Worker void CalcLogicSize(WideStringView str, CFX_SizeF* pSize); 49*3ac0a46fSAndroid Build Coastguard Worker void CalcLogicSize(WideStringView str, CFX_RectF* pRect); 50*3ac0a46fSAndroid Build Coastguard Worker void DrawLogicText(CFX_RenderDevice* device, 51*3ac0a46fSAndroid Build Coastguard Worker const WideString& str, 52*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& rect); GetTotalLines()53*3ac0a46fSAndroid Build Coastguard Worker int32_t GetTotalLines() const { return m_iTotalLines; } 54*3ac0a46fSAndroid Build Coastguard Worker 55*3ac0a46fSAndroid Build Coastguard Worker private: 56*3ac0a46fSAndroid Build Coastguard Worker struct Piece { 57*3ac0a46fSAndroid Build Coastguard Worker Piece(); 58*3ac0a46fSAndroid Build Coastguard Worker Piece(const Piece& that); 59*3ac0a46fSAndroid Build Coastguard Worker ~Piece(); 60*3ac0a46fSAndroid Build Coastguard Worker 61*3ac0a46fSAndroid Build Coastguard Worker size_t start_char = 0; 62*3ac0a46fSAndroid Build Coastguard Worker size_t char_count = 0; 63*3ac0a46fSAndroid Build Coastguard Worker uint32_t char_styles = 0; 64*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF bounds; 65*3ac0a46fSAndroid Build Coastguard Worker }; 66*3ac0a46fSAndroid Build Coastguard Worker 67*3ac0a46fSAndroid Build Coastguard Worker class Line { 68*3ac0a46fSAndroid Build Coastguard Worker public: 69*3ac0a46fSAndroid Build Coastguard Worker Line(); 70*3ac0a46fSAndroid Build Coastguard Worker Line(const Line& that); 71*3ac0a46fSAndroid Build Coastguard Worker ~Line(); 72*3ac0a46fSAndroid Build Coastguard Worker new_reload()73*3ac0a46fSAndroid Build Coastguard Worker bool new_reload() const { return new_reload_; } set_new_reload(bool reload)74*3ac0a46fSAndroid Build Coastguard Worker void set_new_reload(bool reload) { new_reload_ = reload; } 75*3ac0a46fSAndroid Build Coastguard Worker 76*3ac0a46fSAndroid Build Coastguard Worker size_t AddPiece(size_t index, const Piece& piece); 77*3ac0a46fSAndroid Build Coastguard Worker size_t GetSize() const; 78*3ac0a46fSAndroid Build Coastguard Worker const Piece* GetPieceAtIndex(size_t index) const; 79*3ac0a46fSAndroid Build Coastguard Worker Piece* GetPieceAtIndex(size_t index); 80*3ac0a46fSAndroid Build Coastguard Worker void RemoveLast(size_t count); 81*3ac0a46fSAndroid Build Coastguard Worker 82*3ac0a46fSAndroid Build Coastguard Worker private: 83*3ac0a46fSAndroid Build Coastguard Worker bool new_reload_ = false; 84*3ac0a46fSAndroid Build Coastguard Worker std::deque<Piece> pieces_; 85*3ac0a46fSAndroid Build Coastguard Worker }; 86*3ac0a46fSAndroid Build Coastguard Worker 87*3ac0a46fSAndroid Build Coastguard Worker bool RetrieveLineWidth(CFGAS_Char::BreakType dwBreakStatus, 88*3ac0a46fSAndroid Build Coastguard Worker float* pStartPos, 89*3ac0a46fSAndroid Build Coastguard Worker float* pWidth, 90*3ac0a46fSAndroid Build Coastguard Worker float* pHeight); 91*3ac0a46fSAndroid Build Coastguard Worker void LoadText(const WideString& str, const CFX_RectF& rect); 92*3ac0a46fSAndroid Build Coastguard Worker 93*3ac0a46fSAndroid Build Coastguard Worker void Reload(const CFX_RectF& rect); 94*3ac0a46fSAndroid Build Coastguard Worker void ReloadLinePiece(Line* pLine, const CFX_RectF& rect); 95*3ac0a46fSAndroid Build Coastguard Worker bool RetrievePieces(CFGAS_Char::BreakType dwBreakStatus, 96*3ac0a46fSAndroid Build Coastguard Worker bool bReload, 97*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& rect, 98*3ac0a46fSAndroid Build Coastguard Worker size_t* pStartChar, 99*3ac0a46fSAndroid Build Coastguard Worker int32_t* pPieceWidths); 100*3ac0a46fSAndroid Build Coastguard Worker void AppendPiece(const Piece& piece, bool bNeedReload, bool bEnd); 101*3ac0a46fSAndroid Build Coastguard Worker void DoAlignment(const CFX_RectF& rect); 102*3ac0a46fSAndroid Build Coastguard Worker size_t GetDisplayPos(const Piece* pPiece); 103*3ac0a46fSAndroid Build Coastguard Worker 104*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFGAS_TxtBreak> const m_pTxtBreak; 105*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFGAS_GEFont> m_pFont; 106*3ac0a46fSAndroid Build Coastguard Worker float m_fFontSize = 12.0f; 107*3ac0a46fSAndroid Build Coastguard Worker float m_fLineSpace = 12.0f; 108*3ac0a46fSAndroid Build Coastguard Worker float m_fLinePos = 0.0f; 109*3ac0a46fSAndroid Build Coastguard Worker float m_fTolerance = 0.0f; 110*3ac0a46fSAndroid Build Coastguard Worker FDE_TextAlignment m_iAlignment = FDE_TextAlignment::kTopLeft; 111*3ac0a46fSAndroid Build Coastguard Worker FDE_TextStyle m_Styles; 112*3ac0a46fSAndroid Build Coastguard Worker std::vector<int32_t> m_CharWidths; 113*3ac0a46fSAndroid Build Coastguard Worker FX_ARGB m_TxtColor = 0xFF000000; 114*3ac0a46fSAndroid Build Coastguard Worker Mask<CFGAS_Break::LayoutStyle> m_dwTxtBkStyles; 115*3ac0a46fSAndroid Build Coastguard Worker WideString m_wsText; 116*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix m_Matrix; 117*3ac0a46fSAndroid Build Coastguard Worker std::deque<Line> m_ttoLines; 118*3ac0a46fSAndroid Build Coastguard Worker size_t m_iCurLine = 0; 119*3ac0a46fSAndroid Build Coastguard Worker size_t m_iCurPiece = 0; 120*3ac0a46fSAndroid Build Coastguard Worker int32_t m_iTotalLines = 0; 121*3ac0a46fSAndroid Build Coastguard Worker std::vector<TextCharPos> m_CharPos; 122*3ac0a46fSAndroid Build Coastguard Worker }; 123*3ac0a46fSAndroid Build Coastguard Worker 124*3ac0a46fSAndroid Build Coastguard Worker #endif // XFA_FDE_CFDE_TEXTOUT_H_ 125