1 // Copyright 2017 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_BREAK_H_
8 #define XFA_FGAS_LAYOUT_CFX_BREAK_H_
9 
10 #include <stdint.h>
11 
12 #include "core/fxcrt/retain_ptr.h"
13 #include "core/fxcrt/unowned_ptr.h"
14 #include "xfa/fgas/layout/cfx_breakline.h"
15 
16 class CFGAS_GEFont;
17 
18 struct FX_TPO {
19   bool operator<(const FX_TPO& that) const { return pos < that.pos; }
20 
21   int32_t index;
22   int32_t pos;
23 };
24 
25 enum FX_LAYOUTSTYLE {
26   FX_LAYOUTSTYLE_None = 0,
27   FX_LAYOUTSTYLE_Pagination = 0x01,
28   FX_LAYOUTSTYLE_ExpandTab = 0x10,
29   FX_LAYOUTSTYLE_SingleLine = 0x200,
30   FX_LAYOUTSTYLE_CombText = 0x400
31 };
32 
33 class CFX_Break {
34  public:
35   virtual ~CFX_Break();
36 
37   void Reset();
38 
39   void SetLayoutStyles(uint32_t dwLayoutStyles);
GetLayoutStyles()40   uint32_t GetLayoutStyles() const { return m_dwLayoutStyles; }
41 
42   void SetFont(const RetainPtr<CFGAS_GEFont>& pFont);
43   void SetFontSize(float fFontSize);
44   void SetTabWidth(float fTabWidth);
GetTabWidth()45   int32_t GetTabWidth() const { return m_iTabWidth; }
46 
47   void SetHorizontalScale(int32_t iScale);
48   void SetVerticalScale(int32_t iScale);
49   void SetLineBreakTolerance(float fTolerance);
50   void SetLineBoundary(float fLineStart, float fLineEnd);
51 
52   void SetCharSpace(float fCharSpace);
53   void SetParagraphBreakChar(wchar_t wch);
54 
55   int32_t CountBreakPieces() const;
56   const CFX_BreakPiece* GetBreakPieceUnstable(int32_t index) const;
57   void ClearBreakPieces();
58 
59   CFX_Char* GetLastChar(int32_t index, bool bOmitChar, bool bRichText) const;
GetCurrentLineForTesting()60   const CFX_BreakLine* GetCurrentLineForTesting() const {
61     return m_pCurLine.Get();
62   }
63 
64  protected:
65   static const int kMinimumTabWidth;
66   static const float kConversionFactor;
67 
68   explicit CFX_Break(uint32_t dwLayoutStyles);
69 
70   void SetBreakStatus();
HasLine()71   bool HasLine() const { return m_iReadyLineIndex >= 0; }
72   bool IsGreaterThanLineWidth(int32_t width) const;
73   FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE dwType) const;
74 
75   FX_CHARTYPE m_eCharType = FX_CHARTYPE::kUnknown;
76   bool m_bSingleLine = false;
77   bool m_bCombText = false;
78   uint32_t m_dwIdentity = 0;
79   uint32_t m_dwLayoutStyles = 0;
80   int32_t m_iLineStart = 0;
81   int32_t m_iLineWidth = 2000000;
82   wchar_t m_wParagraphBreakChar = L'\n';
83   int32_t m_iFontSize = 240;
84   int32_t m_iTabWidth = 720000;
85   int32_t m_iHorizontalScale = 100;
86   int32_t m_iVerticalScale = 100;
87   int32_t m_iTolerance = 0;
88   int32_t m_iCharSpace = 0;
89   RetainPtr<CFGAS_GEFont> m_pFont;
90   UnownedPtr<CFX_BreakLine> m_pCurLine;
91   int8_t m_iReadyLineIndex = -1;
92   CFX_BreakLine m_Lines[2];
93 };
94 
95 #endif  // XFA_FGAS_LAYOUT_CFX_BREAK_H_
96