// Copyright 2014 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_FDE_CFDE_TEXTOUT_H_ #define XFA_FDE_CFDE_TEXTOUT_H_ #include #include #include #include "core/fxge/fx_dib.h" #include "third_party/base/span.h" #include "xfa/fde/cfde_data.h" #include "xfa/fgas/layout/cfx_char.h" class CFDE_RenderDevice; class CFGAS_GEFont; class CFX_RenderDevice; class CFX_TxtBreak; class TextCharPos; struct FDE_TTOPIECE { FDE_TTOPIECE(); FDE_TTOPIECE(const FDE_TTOPIECE& that); ~FDE_TTOPIECE(); int32_t iStartChar; int32_t iChars; uint32_t dwCharStyles; CFX_RectF rtPiece; }; class CFDE_TextOut { public: static bool DrawString(CFX_RenderDevice* device, FX_ARGB color, const RetainPtr& pFont, pdfium::span pCharPos, float fFontSize, const CFX_Matrix& matrix); CFDE_TextOut(); ~CFDE_TextOut(); void SetFont(const RetainPtr& pFont); void SetFontSize(float fFontSize); void SetTextColor(FX_ARGB color) { m_TxtColor = color; } void SetStyles(const FDE_TextStyle& dwStyles); void SetAlignment(FDE_TextAlignment iAlignment); void SetLineSpace(float fLineSpace); void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; } void SetLineBreakTolerance(float fTolerance); void CalcLogicSize(WideStringView str, CFX_SizeF* pSize); void CalcLogicSize(WideStringView str, CFX_RectF* pRect); void DrawLogicText(CFX_RenderDevice* device, WideStringView str, const CFX_RectF& rect); int32_t GetTotalLines() const { return m_iTotalLines; } private: class CFDE_TTOLine { public: CFDE_TTOLine(); CFDE_TTOLine(const CFDE_TTOLine& ttoLine); ~CFDE_TTOLine(); bool GetNewReload() const { return m_bNewReload; } void SetNewReload(bool reload) { m_bNewReload = reload; } int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece); int32_t GetSize() const; FDE_TTOPIECE* GetPtrAt(int32_t index); void RemoveLast(int32_t iCount); private: bool m_bNewReload; std::deque m_pieces; }; bool RetrieveLineWidth(CFX_BreakType dwBreakStatus, float* pStartPos, float* pWidth, float* pHeight); void LoadText(const WideString& str, const CFX_RectF& rect); void Reload(const CFX_RectF& rect); void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect); bool RetrievePieces(CFX_BreakType dwBreakStatus, bool bReload, const CFX_RectF& rect, int32_t* pStartChar, int32_t* pPieceWidths); void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd); void DoAlignment(const CFX_RectF& rect); size_t GetDisplayPos(FDE_TTOPIECE* pPiece); std::unique_ptr const m_pTxtBreak; RetainPtr m_pFont; float m_fFontSize = 12.0f; float m_fLineSpace = 12.0f; float m_fLinePos = 0.0f; float m_fTolerance = 0.0f; FDE_TextAlignment m_iAlignment = FDE_TextAlignment::kTopLeft; FDE_TextStyle m_Styles; std::vector m_CharWidths; FX_ARGB m_TxtColor = 0xFF000000; uint32_t m_dwTxtBkStyles = 0; WideString m_wsText; CFX_Matrix m_Matrix; std::deque m_ttoLines; int32_t m_iCurLine = 0; int32_t m_iCurPiece = 0; int32_t m_iTotalLines = 0; std::vector m_CharPos; }; #endif // XFA_FDE_CFDE_TEXTOUT_H_