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