• 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_FGAS_LAYOUT_CFX_TXTBREAK_H_
8 #define XFA_FGAS_LAYOUT_CFX_TXTBREAK_H_
9 
10 #include <deque>
11 #include <vector>
12 
13 #include "core/fxcrt/fx_coordinates.h"
14 #include "xfa/fgas/layout/cfx_break.h"
15 #include "xfa/fgas/layout/cfx_char.h"
16 
17 class CFGAS_GEFont;
18 class TextCharPos;
19 
20 #define FX_TXTCHARSTYLE_ArabicShadda 0x0020
21 #define FX_TXTCHARSTYLE_OddBidiLevel 0x0040
22 
23 enum CFX_TxtLineAlignment {
24   CFX_TxtLineAlignment_Left = 0,
25   CFX_TxtLineAlignment_Center = 1 << 0,
26   CFX_TxtLineAlignment_Right = 1 << 1,
27   CFX_TxtLineAlignment_Justified = 1 << 2
28 };
29 
CFX_BreakTypeNoneOrPiece(CFX_BreakType type)30 inline bool CFX_BreakTypeNoneOrPiece(CFX_BreakType type) {
31   return type == CFX_BreakType::None || type == CFX_BreakType::Piece;
32 }
33 
34 class CFX_TxtBreak final : public CFX_Break {
35  public:
36   class Engine {
37    public:
38     virtual ~Engine();
39     virtual wchar_t GetChar(size_t idx) const = 0;
40     // Non-const so we can force a layout if needed.
41     virtual size_t GetWidthOfChar(size_t idx) = 0;
42   };
43 
44   struct Run {
45     Run();
46     Run(const Run& other);
47     ~Run();
48 
49     CFX_TxtBreak::Engine* pEdtEngine = nullptr;
50     WideString wsStr;
51     int32_t* pWidths = nullptr;
52     int32_t iStart = 0;
53     int32_t iLength = 0;
54     RetainPtr<CFGAS_GEFont> pFont;
55     float fFontSize = 12.0f;
56     uint32_t dwStyles = 0;
57     int32_t iHorizontalScale = 100;
58     int32_t iVerticalScale = 100;
59     uint32_t dwCharStyles = 0;
60     const CFX_RectF* pRect = nullptr;
61     bool bSkipSpace = true;
62   };
63 
64   CFX_TxtBreak();
65   ~CFX_TxtBreak() override;
66 
67   void SetLineWidth(float fLineWidth);
68   void SetAlignment(int32_t iAlignment);
69   void SetCombWidth(float fCombWidth);
70   CFX_BreakType EndBreak(CFX_BreakType dwStatus);
71 
72   size_t GetDisplayPos(const Run* pTxtRun, TextCharPos* pCharPos) const;
73   std::vector<CFX_RectF> GetCharRects(const Run* pTxtRun, bool bCharBBox) const;
74   CFX_BreakType AppendChar(wchar_t wch);
75 
76  private:
77   void AppendChar_Combination(CFX_Char* pCurChar);
78   void AppendChar_Tab(CFX_Char* pCurChar);
79   CFX_BreakType AppendChar_Control(CFX_Char* pCurChar);
80   CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar);
81   CFX_BreakType AppendChar_Others(CFX_Char* pCurChar);
82 
83   void ResetContextCharStyles();
84   bool EndBreak_SplitLine(CFX_BreakLine* pNextLine, bool bAllChars);
85   void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_BreakType dwStatus);
86   void EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
87                           bool bAllChars,
88                           CFX_BreakType dwStatus);
89   int32_t GetBreakPos(std::vector<CFX_Char>* pChars,
90                       bool bAllChars,
91                       bool bOnlyBrk,
92                       int32_t* pEndPos);
93   void SplitTextLine(CFX_BreakLine* pCurLine,
94                      CFX_BreakLine* pNextLine,
95                      bool bAllChars);
96 
97   int32_t m_iAlignment;
98   int32_t m_iCombWidth;
99 };
100 
101 #endif  // XFA_FGAS_LAYOUT_CFX_TXTBREAK_H_
102