clang-format all pdfium code.
[pdfium.git] / core / src / fpdftext / text_int.h
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 CORE_SRC_FPDFTEXT_TEXT_INT_H_
8 #define CORE_SRC_FPDFTEXT_TEXT_INT_H_
9
10 class CPDF_TextPage;
11 class CPDF_LinkExtract;
12 class CPDF_TextPageFind;
13 class CPDF_DocProgressiveSearch;
14 #define FPDFTEXT_CHAR_ERROR -1
15 #define FPDFTEXT_CHAR_NORMAL 0
16 #define FPDFTEXT_CHAR_GENERATED 1
17 #define FPDFTEXT_CHAR_UNUNICODE 2
18 #define FPDFTEXT_CHAR_HYPHEN 3
19 #define FPDFTEXT_CHAR_PIECE 4
20 #define FPDFTEXT_MC_PASS 0
21 #define FPDFTEXT_MC_DONE 1
22 #define FPDFTEXT_MC_DELAY 2
23 typedef struct _PAGECHAR_INFO {
24   int m_CharCode;
25   FX_WCHAR m_Unicode;
26   FX_FLOAT m_OriginX;
27   FX_FLOAT m_OriginY;
28   int32_t m_Flag;
29   CFX_FloatRect m_CharBox;
30   CPDF_TextObject* m_pTextObj;
31   CFX_AffineMatrix m_Matrix;
32   int m_Index;
33 } PAGECHAR_INFO;
34 typedef CFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;
35 typedef struct {
36   int m_Start;
37   int m_nCount;
38 } FPDF_SEGMENT;
39 typedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;
40 typedef struct {
41   CPDF_TextObject* m_pTextObj;
42   CFX_AffineMatrix m_formMatrix;
43 } PDFTEXT_Obj;
44 typedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;
45 class CPDF_TextPage : public IPDF_TextPage {
46  public:
47   CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);
48   CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);
49   CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);
50   virtual FX_BOOL ParseTextPage();
51   virtual void NormalizeObjects(FX_BOOL bNormalize);
52   virtual FX_BOOL IsParsered() const { return m_IsParsered; }
53   virtual ~CPDF_TextPage(){};
54
55  public:
56   virtual int CharIndexFromTextIndex(int TextIndex) const;
57   virtual int TextIndexFromCharIndex(int CharIndex) const;
58   virtual int CountChars() const;
59   virtual void GetCharInfo(int index, FPDF_CHAR_INFO& info) const;
60   virtual void GetRectArray(int start,
61                             int nCount,
62                             CFX_RectArray& rectArray) const;
63   virtual int GetIndexAtPos(CPDF_Point point,
64                             FX_FLOAT xTorelance,
65                             FX_FLOAT yTorelance) const;
66   virtual int GetIndexAtPos(FX_FLOAT x,
67                             FX_FLOAT y,
68                             FX_FLOAT xTorelance,
69                             FX_FLOAT yTorelance) const;
70   virtual CFX_WideString GetTextByRect(const CFX_FloatRect& rect) const;
71   virtual void GetRectsArrayByRect(const CFX_FloatRect& rect,
72                                    CFX_RectArray& resRectArray) const;
73   virtual CFX_WideString GetPageText(int start = 0, int nCount = -1) const;
74
75   virtual int CountRects(int start, int nCount);
76   virtual void GetRect(int rectIndex,
77                        FX_FLOAT& left,
78                        FX_FLOAT& top,
79                        FX_FLOAT& right,
80                        FX_FLOAT& bottom) const;
81   virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate);
82   virtual FX_BOOL GetBaselineRotate(const CFX_FloatRect& rect, int& Rotate);
83   virtual int CountBoundedSegments(FX_FLOAT left,
84                                    FX_FLOAT top,
85                                    FX_FLOAT right,
86                                    FX_FLOAT bottom,
87                                    FX_BOOL bContains = FALSE);
88   virtual void GetBoundedSegment(int index, int& start, int& count) const;
89   virtual int GetWordBreak(int index, int direction) const;
90
91  public:
92   const PAGECHAR_InfoArray* GetCharList() const { return &m_charList; }
93   static FX_BOOL IsRectIntersect(const CFX_FloatRect& rect1,
94                                  const CFX_FloatRect& rect2);
95   static FX_BOOL IsLetter(FX_WCHAR unicode);
96
97  private:
98   FX_BOOL IsHyphen(FX_WCHAR curChar);
99   bool IsControlChar(const PAGECHAR_INFO& charInfo);
100   FX_BOOL GetBaselineRotate(int start, int end, int& Rotate);
101   void ProcessObject();
102   void ProcessFormObject(CPDF_FormObject* pFormObj,
103                          const CFX_AffineMatrix& formMatrix);
104   void ProcessTextObject(PDFTEXT_Obj pObj);
105   void ProcessTextObject(CPDF_TextObject* pTextObj,
106                          const CFX_AffineMatrix& formMatrix,
107                          FX_POSITION ObjPos);
108   int ProcessInsertObject(const CPDF_TextObject* pObj,
109                           const CFX_AffineMatrix& formMatrix);
110   FX_BOOL GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);
111   FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);
112   FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1,
113                            CPDF_TextObject* pTextObj2);
114   int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
115   void CloseTempLine();
116   void OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);
117   int32_t PreMarkedContent(PDFTEXT_Obj pObj);
118   void ProcessMarkedContent(PDFTEXT_Obj pObj);
119   void CheckMarkedContentObject(int32_t& start, int32_t& nCount) const;
120   void FindPreviousTextObject(void);
121   void AddCharInfoByLRDirection(CFX_WideString& str, int i);
122   void AddCharInfoByRLDirection(CFX_WideString& str, int i);
123   int32_t GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);
124   int32_t FindTextlineFlowDirection();
125   void SwapTempTextBuf(int32_t iCharListStartAppend, int32_t iBufStartAppend);
126   FX_BOOL IsRightToLeft(const CPDF_TextObject* pTextObj,
127                         const CPDF_Font* pFont,
128                         int nItems) const;
129
130  protected:
131   CPDFText_ParseOptions m_ParseOptions;
132   CFX_WordArray m_CharIndex;
133   const CPDF_PageObjects* m_pPage;
134   PAGECHAR_InfoArray m_charList;
135   CFX_WideTextBuf m_TextBuf;
136   PAGECHAR_InfoArray m_TempCharList;
137   CFX_WideTextBuf m_TempTextBuf;
138   int m_parserflag;
139   CPDF_TextObject* m_pPreTextObj;
140   CFX_AffineMatrix m_perMatrix;
141   FX_BOOL m_IsParsered;
142   CFX_AffineMatrix m_DisplayMatrix;
143
144   SEGMENT_Array m_Segment;
145   CFX_RectArray m_SelRects;
146   LINEOBJ m_LineObj;
147   int32_t m_TextlineDir;
148   CFX_FloatRect m_CurlineRect;
149 };
150 class CPDF_TextPageFind : public IPDF_TextPageFind {
151  public:
152   CPDF_TextPageFind(const IPDF_TextPage* pTextPage);
153   virtual ~CPDF_TextPageFind(){};
154
155  public:
156   virtual FX_BOOL FindFirst(const CFX_WideString& findwhat,
157                             int flags,
158                             int startPos = 0);
159   virtual FX_BOOL FindNext();
160   virtual FX_BOOL FindPrev();
161
162   virtual void GetRectArray(CFX_RectArray& rects) const;
163   virtual int GetCurOrder() const;
164   virtual int GetMatchedCount() const;
165
166  protected:
167   void ExtractFindWhat(const CFX_WideString& findwhat);
168   FX_BOOL IsMatchWholeWord(const CFX_WideString& csPageText,
169                            int startPos,
170                            int endPos);
171   FX_BOOL ExtractSubString(CFX_WideString& rString,
172                            const FX_WCHAR* lpszFullString,
173                            int iSubString,
174                            FX_WCHAR chSep);
175   CFX_WideString MakeReverse(const CFX_WideString& str);
176   int ReverseFind(const CFX_WideString& csPageText,
177                   const CFX_WideString& csWord,
178                   int nStartPos,
179                   int& WordLength);
180   int GetCharIndex(int index) const;
181
182  private:
183   CFX_WordArray m_CharIndex;
184   const IPDF_TextPage* m_pTextPage;
185   CFX_WideString m_strText;
186   CFX_WideString m_findWhat;
187   int m_flags;
188   CFX_WideStringArray m_csFindWhatArray;
189   int m_findNextStart;
190   int m_findPreStart;
191   FX_BOOL m_bMatchCase;
192   FX_BOOL m_bMatchWholeWord;
193   int m_resStart;
194   int m_resEnd;
195   CFX_RectArray m_resArray;
196   FX_BOOL m_IsFind;
197 };
198 class CPDF_LinkExt {
199  public:
200   CPDF_LinkExt(){};
201   int m_Start;
202   int m_Count;
203   CFX_WideString m_strUrl;
204   virtual ~CPDF_LinkExt(){};
205 };
206 typedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;
207 class CPDF_LinkExtract : public IPDF_LinkExtract {
208  public:
209   CPDF_LinkExtract();
210   virtual ~CPDF_LinkExtract();
211   virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage);
212   virtual FX_BOOL IsExtract() const { return m_IsParserd; }
213
214  public:
215   virtual int CountLinks() const;
216   virtual CFX_WideString GetURL(int index) const;
217   virtual void GetBoundedSegment(int index, int& start, int& count) const;
218   virtual void GetRects(int index, CFX_RectArray& rects) const;
219
220  protected:
221   void parserLink();
222   void DeleteLinkList();
223   FX_BOOL CheckWebLink(CFX_WideString& strBeCheck);
224   FX_BOOL CheckMailLink(CFX_WideString& str);
225   FX_BOOL AppendToLinkList(int start, int count, const CFX_WideString& strUrl);
226
227  private:
228   LINK_InfoArray m_LinkList;
229   const CPDF_TextPage* m_pTextPage;
230   CFX_WideString m_strPageText;
231   FX_BOOL m_IsParserd;
232 };
233 FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_WCHAR* pDst);
234 void NormalizeString(CFX_WideString& str);
235 void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);
236
237 #endif  // CORE_SRC_FPDFTEXT_TEXT_INT_H_