• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef XFA_FDE_CFDE_TEXTOUT_H_
8 #define XFA_FDE_CFDE_TEXTOUT_H_
9 
10 #include <deque>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/fxcrt/cfx_char.h"
15 #include "core/fxge/cfx_defaultrenderdevice.h"
16 #include "core/fxge/cfx_renderdevice.h"
17 #include "core/fxge/fx_dib.h"
18 #include "xfa/fde/cfde_data.h"
19 
20 class CFDE_RenderDevice;
21 class CFGAS_GEFont;
22 class CFX_RenderDevice;
23 class CFX_TxtBreak;
24 
25 class CFDE_TextOut {
26  public:
27   static bool DrawString(CFX_RenderDevice* device,
28                          FX_ARGB color,
29                          const RetainPtr<CFGAS_GEFont>& pFont,
30                          FXTEXT_CHARPOS* pCharPos,
31                          int32_t iCount,
32                          float fFontSize,
33                          const CFX_Matrix* pMatrix);
34 
35   CFDE_TextOut();
36   ~CFDE_TextOut();
37 
38   void SetFont(const RetainPtr<CFGAS_GEFont>& pFont);
39   void SetFontSize(float fFontSize);
SetTextColor(FX_ARGB color)40   void SetTextColor(FX_ARGB color) { m_TxtColor = color; }
41   void SetStyles(const FDE_TextStyle& dwStyles);
42   void SetAlignment(FDE_TextAlignment iAlignment);
43   void SetLineSpace(float fLineSpace);
SetMatrix(const CFX_Matrix & matrix)44   void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
45   void SetLineBreakTolerance(float fTolerance);
46 
47   void CalcLogicSize(const WideString& str, CFX_SizeF& size);
48   void CalcLogicSize(const WideString& str, CFX_RectF& rect);
49   void DrawLogicText(CFX_RenderDevice* device,
50                      const WideStringView& str,
51                      const CFX_RectF& rect);
GetTotalLines()52   int32_t GetTotalLines() const { return m_iTotalLines; }
53 
54  private:
55   class CFDE_TTOLine {
56    public:
57     CFDE_TTOLine();
58     CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
59     ~CFDE_TTOLine();
60 
GetNewReload()61     bool GetNewReload() const { return m_bNewReload; }
SetNewReload(bool reload)62     void SetNewReload(bool reload) { m_bNewReload = reload; }
63     int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
64     int32_t GetSize() const;
65     FDE_TTOPIECE* GetPtrAt(int32_t index);
66     void RemoveLast(int32_t iCount);
67 
68    private:
69     bool m_bNewReload;
70     std::deque<FDE_TTOPIECE> m_pieces;
71   };
72 
73   bool RetrieveLineWidth(CFX_BreakType dwBreakStatus,
74                          float& fStartPos,
75                          float& fWidth,
76                          float& fHeight);
77   void LoadText(const WideString& str, const CFX_RectF& rect);
78 
79   void Reload(const CFX_RectF& rect);
80   void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
81   bool RetrievePieces(CFX_BreakType dwBreakStatus,
82                       int32_t& iStartChar,
83                       int32_t& iPieceWidths,
84                       bool bReload,
85                       const CFX_RectF& rect);
86   void AppendPiece(const FDE_TTOPIECE& ttoPiece, bool bNeedReload, bool bEnd);
87   void DoAlignment(const CFX_RectF& rect);
88   int32_t GetDisplayPos(FDE_TTOPIECE* pPiece);
89 
90   std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
91   RetainPtr<CFGAS_GEFont> m_pFont;
92   float m_fFontSize;
93   float m_fLineSpace;
94   float m_fLinePos;
95   float m_fTolerance;
96   FDE_TextAlignment m_iAlignment;
97   FDE_TextStyle m_Styles;
98   std::vector<int32_t> m_CharWidths;
99   FX_ARGB m_TxtColor;
100   uint32_t m_dwTxtBkStyles;
101   WideString m_wsText;
102   CFX_Matrix m_Matrix;
103   std::deque<CFDE_TTOLine> m_ttoLines;
104   int32_t m_iCurLine;
105   int32_t m_iCurPiece;
106   int32_t m_iTotalLines;
107   std::vector<FXTEXT_CHARPOS> m_CharPos;
108 };
109 
110 #endif  // XFA_FDE_CFDE_TEXTOUT_H_
111