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