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 _FX_TEXTBREAK_IMP
8#define _FX_TEXTBREAK_IMP
9
10#include "core/include/fxcrt/fx_memory.h"
11
12class IFX_ArabicChar;
13class CFX_Txtbreak;
14
15class CFX_TxtLine {
16 public:
17  CFX_TxtLine(int32_t iBlockSize)
18      : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {
19    m_pLineChars = new CFX_TxtCharArray;
20    m_pLinePieces = new CFX_TxtPieceArray(16);
21  }
22  ~CFX_TxtLine() {
23    RemoveAll();
24    delete m_pLineChars;
25    delete m_pLinePieces;
26  }
27  int32_t CountChars() const { return m_pLineChars->GetSize(); }
28  CFX_TxtChar* GetCharPtr(int32_t index) const {
29    FXSYS_assert(index > -1 && index < m_pLineChars->GetSize());
30    return m_pLineChars->GetDataPtr(index);
31  }
32  int32_t CountPieces() const { return m_pLinePieces->GetSize(); }
33  CFX_TxtPiece* GetPiecePtr(int32_t index) const {
34    FXSYS_assert(index > -1 && index < m_pLinePieces->GetSize());
35    return m_pLinePieces->GetPtrAt(index);
36  }
37  void GetString(CFX_WideString& wsStr) const {
38    int32_t iCount = m_pLineChars->GetSize();
39    FX_WCHAR* pBuf = wsStr.GetBuffer(iCount);
40    CFX_Char* pChar;
41    for (int32_t i = 0; i < iCount; i++) {
42      pChar = m_pLineChars->GetDataPtr(i);
43      *pBuf++ = (FX_WCHAR)pChar->m_wCharCode;
44    }
45    wsStr.ReleaseBuffer(iCount);
46  }
47  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
48    m_pLineChars->RemoveAll();
49    m_pLinePieces->RemoveAll(bLeaveMemory);
50    m_iWidth = 0;
51    m_iArabicChars = 0;
52  }
53  CFX_TxtCharArray* m_pLineChars;
54  CFX_TxtPieceArray* m_pLinePieces;
55  int32_t m_iStart;
56  int32_t m_iWidth;
57  int32_t m_iArabicChars;
58};
59class CFX_TxtBreak : public IFX_TxtBreak {
60 public:
61  CFX_TxtBreak(FX_DWORD dwPolicies);
62  ~CFX_TxtBreak();
63  virtual void Release() { delete this; }
64  virtual void SetLineWidth(FX_FLOAT fLineWidth);
65  virtual void SetLinePos(FX_FLOAT fLinePos);
66  virtual FX_DWORD GetLayoutStyles() const { return m_dwLayoutStyles; }
67  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles);
68  virtual void SetFont(IFX_Font* pFont);
69  virtual void SetFontSize(FX_FLOAT fFontSize);
70  virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
71  virtual void SetDefaultChar(FX_WCHAR wch);
72  virtual void SetParagraphBreakChar(FX_WCHAR wch);
73  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
74  virtual void SetHorizontalScale(int32_t iScale);
75  virtual void SetVerticalScale(int32_t iScale);
76  virtual void SetCharRotation(int32_t iCharRotation);
77  virtual void SetCharSpace(FX_FLOAT fCharSpace);
78  virtual void SetAlignment(int32_t iAlignment);
79  virtual FX_DWORD GetContextCharStyles() const;
80  virtual void SetContextCharStyles(FX_DWORD dwCharStyles);
81  virtual void SetCombWidth(FX_FLOAT fCombWidth);
82  virtual void SetUserData(void* pUserData);
83  virtual FX_DWORD AppendChar(FX_WCHAR wch);
84  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak);
85  virtual int32_t CountBreakChars() const;
86  virtual int32_t CountBreakPieces() const;
87  virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const;
88  virtual void ClearBreakPieces();
89  virtual void Reset();
90  virtual int32_t GetDisplayPos(
91      FX_LPCTXTRUN pTxtRun,
92      FXTEXT_CHARPOS* pCharPos,
93      FX_BOOL bCharCode = FALSE,
94      CFX_WideString* pWSForms = NULL,
95      FX_AdjustCharDisplayPos pAdjustPos = NULL) const;
96  virtual int32_t GetCharRects(FX_LPCTXTRUN pTxtRun,
97                               CFX_RectFArray& rtArray,
98                               FX_BOOL bCharBBox = FALSE) const;
99  void AppendChar_PageLoad(CFX_Char* pCurChar, FX_DWORD dwProps);
100  FX_DWORD AppendChar_Combination(CFX_Char* pCurChar, int32_t iRotation);
101  FX_DWORD AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation);
102  FX_DWORD AppendChar_Control(CFX_Char* pCurChar, int32_t iRotation);
103  FX_DWORD AppendChar_Arabic(CFX_Char* pCurChar, int32_t iRotation);
104  FX_DWORD AppendChar_Others(CFX_Char* pCurChar, int32_t iRotation);
105
106 protected:
107  FX_DWORD m_dwPolicies;
108  FX_BOOL m_bPagination;
109  IFX_ArabicChar* m_pArabicChar;
110  int32_t m_iLineWidth;
111  FX_DWORD m_dwLayoutStyles;
112  FX_BOOL m_bVertical;
113  FX_BOOL m_bArabicContext;
114  FX_BOOL m_bArabicShapes;
115  FX_BOOL m_bRTL;
116  FX_BOOL m_bSingleLine;
117  FX_BOOL m_bCombText;
118  int32_t m_iArabicContext;
119  int32_t m_iCurArabicContext;
120  IFX_Font* m_pFont;
121  int32_t m_iFontSize;
122  FX_BOOL m_bEquidistant;
123  int32_t m_iTabWidth;
124  FX_WCHAR m_wDefChar;
125  FX_WCHAR m_wParagBreakChar;
126  int32_t m_iDefChar;
127  int32_t m_iLineRotation;
128  int32_t m_iCharRotation;
129  int32_t m_iRotation;
130  int32_t m_iAlignment;
131  FX_DWORD m_dwContextCharStyles;
132  int32_t m_iCombWidth;
133  void* m_pUserData;
134  FX_DWORD m_dwCharType;
135  FX_BOOL m_bCurRTL;
136  int32_t m_iCurAlignment;
137  FX_BOOL m_bArabicNumber;
138  FX_BOOL m_bArabicComma;
139  CFX_TxtLine* m_pTxtLine1;
140  CFX_TxtLine* m_pTxtLine2;
141  CFX_TxtLine* m_pCurLine;
142  int32_t m_iReady;
143  int32_t m_iTolerance;
144  int32_t m_iHorScale;
145  int32_t m_iVerScale;
146  int32_t m_iCharSpace;
147  void SetBreakStatus();
148  int32_t GetLineRotation(FX_DWORD dwStyles) const;
149  CFX_TxtChar* GetLastChar(int32_t index, FX_BOOL bOmitChar = TRUE) const;
150  CFX_TxtLine* GetTxtLine(FX_BOOL bReady) const;
151  CFX_TxtPieceArray* GetTxtPieces(FX_BOOL bReady) const;
152  FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const;
153  void ResetArabicContext();
154  void ResetContextCharStyles();
155  void EndBreak_UpdateArabicShapes();
156  FX_BOOL EndBreak_SplitLine(CFX_TxtLine* pNextLine,
157                             FX_BOOL bAllChars,
158                             FX_DWORD dwStatus);
159  void EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus);
160  void EndBreak_Alignment(CFX_TPOArray& tpos,
161                          FX_BOOL bAllChars,
162                          FX_DWORD dwStatus);
163  int32_t GetBreakPos(CFX_TxtCharArray& ca,
164                      int32_t& iEndPos,
165                      FX_BOOL bAllChars = FALSE,
166                      FX_BOOL bOnlyBrk = FALSE);
167  void SplitTextLine(CFX_TxtLine* pCurLine,
168                     CFX_TxtLine* pNextLine,
169                     FX_BOOL bAllChars = FALSE);
170};
171#endif
172