be81244ef4df5cad7c62c395def72a8e29ced0d0
[pdfium.git] / core / include / fpdfapi / fpdf_pageobj.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_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_
9
10 #include "../fxge/fx_ge.h"
11 #include "fpdf_resource.h"
12
13 class CPDF_Path;
14 class CPDF_ClipPathData;
15 class CPDF_ClipPath;
16 class CPDF_ColorStateData;
17 class CPDF_ColorState;
18 class CPDF_GraphState;
19 class CPDF_TextStateData;
20 class CPDF_TextState;
21 class CPDF_GeneralStateData;
22 class CPDF_GeneralState;
23 class CPDF_ContentMarkItem;
24 class CPDF_ContentMark;
25 class CPDF_GraphicStates;
26 class CPDF_PageObject;
27 class CPDF_TextObject;
28 class CPDF_PathObject;
29 class CPDF_ImageObject;
30 class CPDF_ShadingObject;
31 class CPDF_FormObject;
32 typedef CFX_PathData CPDF_PathData;
33
34 class CPDF_Path : public CFX_CountRef<CFX_PathData> {
35  public:
36   int GetPointCount() { return m_pObject->m_PointCount; }
37
38   int GetFlag(int index) { return m_pObject->m_pPoints[index].m_Flag; }
39
40   FX_FLOAT GetPointX(int index) { return m_pObject->m_pPoints[index].m_PointX; }
41
42   FX_FLOAT GetPointY(int index) { return m_pObject->m_pPoints[index].m_PointY; }
43
44   FX_PATHPOINT* GetPoints() { return m_pObject->m_pPoints; }
45
46   CFX_FloatRect GetBoundingBox() const { return m_pObject->GetBoundingBox(); }
47
48   CFX_FloatRect GetBoundingBox(FX_FLOAT line_width,
49                                FX_FLOAT miter_limit) const {
50     return m_pObject->GetBoundingBox(line_width, miter_limit);
51   }
52
53   void Transform(const CFX_AffineMatrix* pMatrix) {
54     GetModify()->Transform(pMatrix);
55   }
56
57   void Append(CPDF_Path src, const CFX_AffineMatrix* pMatrix) {
58     m_pObject->Append(src.m_pObject, pMatrix);
59   }
60
61   void AppendRect(FX_FLOAT left,
62                   FX_FLOAT bottom,
63                   FX_FLOAT right,
64                   FX_FLOAT top) {
65     m_pObject->AppendRect(left, bottom, right, top);
66   }
67
68   FX_BOOL IsRect() const { return m_pObject->IsRect(); }
69 };
70 class CPDF_ClipPathData {
71  public:
72   CPDF_ClipPathData();
73
74   CPDF_ClipPathData(const CPDF_ClipPathData&);
75
76   ~CPDF_ClipPathData();
77
78   void SetCount(int path_count, int text_count);
79
80  public:
81   int m_PathCount;
82
83   CPDF_Path* m_pPathList;
84
85   uint8_t* m_pTypeList;
86
87   int m_TextCount;
88
89   CPDF_TextObject** m_pTextList;
90 };
91 class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData> {
92  public:
93   FX_DWORD GetPathCount() const { return m_pObject->m_PathCount; }
94
95   CPDF_Path GetPath(int i) const { return m_pObject->m_pPathList[i]; }
96
97   int GetClipType(int i) const { return m_pObject->m_pTypeList[i]; }
98
99   FX_DWORD GetTextCount() const { return m_pObject->m_TextCount; }
100
101   CPDF_TextObject* GetText(int i) const { return m_pObject->m_pTextList[i]; }
102
103   CFX_FloatRect GetClipBox() const;
104
105   void AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
106
107   void DeletePath(int layer_index);
108
109   void AppendTexts(CPDF_TextObject** pTexts, int count);
110
111   void Transform(const CFX_AffineMatrix& matrix);
112 };
113 class CPDF_ColorStateData {
114  public:
115   CPDF_ColorStateData() : m_FillRGB(0), m_StrokeRGB(0) {}
116
117   CPDF_ColorStateData(const CPDF_ColorStateData& src);
118
119   void Default();
120
121   CPDF_Color m_FillColor;
122
123   FX_DWORD m_FillRGB;
124
125   CPDF_Color m_StrokeColor;
126
127   FX_DWORD m_StrokeRGB;
128 };
129 class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData> {
130  public:
131   CPDF_Color* GetFillColor() const {
132     return m_pObject ? &m_pObject->m_FillColor : NULL;
133   }
134
135   CPDF_Color* GetStrokeColor() const {
136     return m_pObject ? &m_pObject->m_StrokeColor : NULL;
137   }
138
139   void SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
140
141   void SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
142
143   void SetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
144
145   void SetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
146
147  private:
148   void SetColor(CPDF_Color& color,
149                 FX_DWORD& rgb,
150                 CPDF_ColorSpace* pCS,
151                 FX_FLOAT* pValue,
152                 int nValues);
153 };
154 typedef CFX_GraphStateData CPDF_GraphStateData;
155 class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData> {
156  public:
157 };
158 class CPDF_TextStateData {
159  public:
160   CPDF_TextStateData();
161
162   CPDF_TextStateData(const CPDF_TextStateData& src);
163
164   ~CPDF_TextStateData();
165
166   CPDF_Font* m_pFont;
167
168   CPDF_Document* m_pDocument;
169
170   FX_FLOAT m_FontSize;
171
172   FX_FLOAT m_CharSpace;
173
174   FX_FLOAT m_WordSpace;
175
176   FX_FLOAT m_Matrix[4];
177
178   int m_TextMode;
179
180   FX_FLOAT m_CTM[4];
181 };
182 class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData> {
183  public:
184   CPDF_Font* GetFont() const { return m_pObject->m_pFont; }
185
186   void SetFont(CPDF_Font* pFont);
187
188   FX_FLOAT GetFontSize() const { return m_pObject->m_FontSize; }
189
190   FX_FLOAT* GetMatrix() const { return m_pObject->m_Matrix; }
191
192   FX_FLOAT GetFontSizeV() const;
193
194   FX_FLOAT GetFontSizeH() const;
195
196   FX_FLOAT GetBaselineAngle() const;
197
198   FX_FLOAT GetShearAngle() const;
199 };
200 class CPDF_TransferFunc;
201 class CPDF_GeneralStateData {
202  public:
203   CPDF_GeneralStateData();
204
205   CPDF_GeneralStateData(const CPDF_GeneralStateData& src);
206   ~CPDF_GeneralStateData();
207
208   void SetBlendMode(const CFX_ByteStringC& blend_mode);
209
210   char m_BlendMode[16];
211
212   int m_BlendType;
213
214   CPDF_Object* m_pSoftMask;
215
216   FX_FLOAT m_SMaskMatrix[6];
217
218   FX_FLOAT m_StrokeAlpha;
219
220   FX_FLOAT m_FillAlpha;
221
222   CPDF_Object* m_pTR;
223
224   CPDF_TransferFunc* m_pTransferFunc;
225
226   CFX_Matrix m_Matrix;
227
228   int m_RenderIntent;
229
230   FX_BOOL m_StrokeAdjust;
231
232   FX_BOOL m_AlphaSource;
233
234   FX_BOOL m_TextKnockout;
235
236   FX_BOOL m_StrokeOP;
237
238   FX_BOOL m_FillOP;
239
240   int m_OPMode;
241
242   CPDF_Object* m_pBG;
243
244   CPDF_Object* m_pUCR;
245
246   CPDF_Object* m_pHT;
247
248   FX_FLOAT m_Flatness;
249
250   FX_FLOAT m_Smoothness;
251 };
252 class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData> {
253  public:
254   void SetRenderIntent(const CFX_ByteString& ri);
255
256   int GetBlendType() const {
257     return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;
258   }
259
260   int GetAlpha(FX_BOOL bStroke) const {
261     return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha
262                                             : m_pObject->m_FillAlpha) *
263                                    255)
264                      : 255;
265   }
266 };
267 class CPDF_ContentMarkItem {
268  public:
269   typedef enum { None, PropertiesDict, DirectDict, MCID } ParamType;
270
271   CPDF_ContentMarkItem();
272
273   CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);
274
275   ~CPDF_ContentMarkItem();
276
277   inline const CFX_ByteString& GetName() const { return m_MarkName; }
278
279   inline ParamType GetParamType() const { return m_ParamType; }
280
281   inline void* GetParam() const { return m_pParam; }
282
283   inline FX_BOOL HasMCID() const;
284
285   inline void SetName(const CFX_ByteString& name) { m_MarkName = name; }
286
287   inline void SetParam(ParamType type, void* param) {
288     m_ParamType = type;
289     m_pParam = param;
290   }
291
292  private:
293   CFX_ByteString m_MarkName;
294
295   ParamType m_ParamType;
296
297   void* m_pParam;
298 };
299 class CPDF_ContentMarkData {
300  public:
301   CPDF_ContentMarkData() {}
302
303   CPDF_ContentMarkData(const CPDF_ContentMarkData& src);
304
305   inline int CountItems() const { return m_Marks.GetSize(); }
306
307   inline CPDF_ContentMarkItem& GetItem(int index) const {
308     return m_Marks[index];
309   }
310
311   int GetMCID() const;
312
313   void AddMark(const CFX_ByteString& name,
314                CPDF_Dictionary* pDict,
315                FX_BOOL bDictNeedClone);
316
317   void DeleteLastMark();
318
319  private:
320   CFX_ObjectArray<CPDF_ContentMarkItem> m_Marks;
321 };
322 class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData> {
323  public:
324   int GetMCID() const { return m_pObject ? m_pObject->GetMCID() : -1; }
325
326   FX_BOOL HasMark(const CFX_ByteStringC& mark) const;
327
328   FX_BOOL LookupMark(const CFX_ByteStringC& mark,
329                      CPDF_Dictionary*& pDict) const;
330 };
331
332 #define PDFPAGE_TEXT 1
333 #define PDFPAGE_PATH 2
334 #define PDFPAGE_IMAGE 3
335 #define PDFPAGE_SHADING 4
336 #define PDFPAGE_FORM 5
337
338 class CPDF_GraphicStates {
339  public:
340   void CopyStates(const CPDF_GraphicStates& src);
341
342   void DefaultStates();
343
344   CPDF_ClipPath m_ClipPath;
345
346   CPDF_GraphState m_GraphState;
347
348   CPDF_ColorState m_ColorState;
349
350   CPDF_TextState m_TextState;
351
352   CPDF_GeneralState m_GeneralState;
353 };
354
355 class CPDF_PageObject : public CPDF_GraphicStates {
356  public:
357   static CPDF_PageObject* Create(int type);
358   virtual ~CPDF_PageObject();
359
360   CPDF_PageObject* Clone() const;
361
362   void Copy(const CPDF_PageObject* pSrcObject);
363
364   virtual void Transform(const CFX_AffineMatrix& matrix) = 0;
365
366   void RemoveClipPath();
367
368   void AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
369
370   void CopyClipPath(CPDF_PageObject* pObj);
371
372   void TransformClipPath(CFX_AffineMatrix& matrix);
373
374   void TransformGeneralState(CFX_AffineMatrix& matrix);
375
376   void SetColorState(CPDF_ColorState state) { m_ColorState = state; }
377
378   FX_RECT GetBBox(const CFX_AffineMatrix* pMatrix) const;
379
380   int m_Type;
381
382   FX_FLOAT m_Left;
383
384   FX_FLOAT m_Right;
385
386   FX_FLOAT m_Top;
387
388   FX_FLOAT m_Bottom;
389
390   CPDF_ContentMark m_ContentMark;
391
392  protected:
393   virtual void CopyData(const CPDF_PageObject* pSrcObject) = 0;
394
395   void RecalcBBox();
396
397   CPDF_PageObject() {}
398 };
399
400 struct CPDF_TextObjectItem {
401   FX_DWORD m_CharCode;
402   FX_FLOAT m_OriginX;
403   FX_FLOAT m_OriginY;
404 };
405
406 class CPDF_TextObject : public CPDF_PageObject {
407  public:
408   CPDF_TextObject();
409   ~CPDF_TextObject() override;
410
411   int CountItems() const { return m_nChars; }
412
413   void GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;
414
415   int CountChars() const;
416
417   void GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;
418   void GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;
419
420   void GetCharRect(int index, CFX_FloatRect& rect) const;
421
422   FX_FLOAT GetCharWidth(FX_DWORD charcode) const;
423   FX_FLOAT GetSpaceCharWidth() const;
424
425   FX_FLOAT GetPosX() const { return m_PosX; }
426
427   FX_FLOAT GetPosY() const { return m_PosY; }
428
429   void GetTextMatrix(CFX_AffineMatrix* pMatrix) const;
430
431   CPDF_Font* GetFont() const { return m_TextState.GetFont(); }
432
433   FX_FLOAT GetFontSize() const { return m_TextState.GetFontSize(); }
434
435   void SetEmpty();
436
437   void SetText(const CFX_ByteString& text);
438
439   void SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
440
441   void SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);
442
443   void SetPosition(FX_FLOAT x, FX_FLOAT y);
444
445   void SetTextState(CPDF_TextState TextState);
446
447   // CPDF_PageObject:
448   void Transform(const CFX_AffineMatrix& matrix) override;
449
450   void CalcCharPos(FX_FLOAT* pPosArray) const;
451
452   void SetData(int nChars,
453                FX_DWORD* pCharCodes,
454                FX_FLOAT* pCharPos,
455                FX_FLOAT x,
456                FX_FLOAT y);
457
458   void GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos) {
459     nChars = m_nChars;
460     pCharCodes = m_pCharCodes;
461     pCharPos = m_pCharPos;
462   }
463
464   void RecalcPositionData() { CalcPositionData(nullptr, nullptr, 1); }
465
466  protected:
467   friend class CPDF_RenderStatus;
468   friend class CPDF_StreamContentParser;
469   friend class CPDF_TextRenderer;
470   friend class CTextPage;
471
472   // CPDF_PageObject:
473   void CopyData(const CPDF_PageObject* pSrcObject) override;
474
475   void SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
476
477   void CalcPositionData(FX_FLOAT* pTextAdvanceX,
478                         FX_FLOAT* pTextAdvanceY,
479                         FX_FLOAT horz_scale,
480                         int level = 0);
481
482   FX_FLOAT m_PosX;
483   FX_FLOAT m_PosY;
484
485   int m_nChars;
486
487   FX_DWORD* m_pCharCodes;
488
489   FX_FLOAT* m_pCharPos;
490 };
491
492 class CPDF_PathObject : public CPDF_PageObject {
493  public:
494   CPDF_PathObject() { m_Type = PDFPAGE_PATH; }
495
496   virtual ~CPDF_PathObject() {}
497   void Transform(const CFX_AffineMatrix& maxtrix) override;
498
499   void SetGraphState(CPDF_GraphState GraphState);
500
501   CPDF_Path m_Path;
502
503   int m_FillType;
504
505   FX_BOOL m_bStroke;
506
507   CFX_AffineMatrix m_Matrix;
508
509   void CalcBoundingBox();
510
511  protected:
512   void CopyData(const CPDF_PageObject* pSrcObject) override;
513 };
514
515 class CPDF_ImageObject : public CPDF_PageObject {
516  public:
517   CPDF_ImageObject();
518
519   virtual ~CPDF_ImageObject();
520   void Transform(const CFX_AffineMatrix& matrix) override;
521
522   CPDF_Image* m_pImage;
523
524   CFX_AffineMatrix m_Matrix;
525
526   void CalcBoundingBox();
527
528  private:
529   void CopyData(const CPDF_PageObject* pSrcObject) override;
530 };
531
532 class CPDF_ShadingObject : public CPDF_PageObject {
533  public:
534   CPDF_ShadingObject();
535
536   virtual ~CPDF_ShadingObject();
537
538   CPDF_ShadingPattern* m_pShading;
539
540   CFX_AffineMatrix m_Matrix;
541
542   void Transform(const CFX_AffineMatrix& matrix) override;
543
544   void CalcBoundingBox();
545
546  protected:
547   void CopyData(const CPDF_PageObject* pSrcObject) override;
548 };
549
550 class CPDF_FormObject : public CPDF_PageObject {
551  public:
552   CPDF_FormObject() {
553     m_Type = PDFPAGE_FORM;
554     m_pForm = NULL;
555   }
556
557   virtual ~CPDF_FormObject();
558   void Transform(const CFX_AffineMatrix& matrix) override;
559
560   CPDF_Form* m_pForm;
561
562   CFX_AffineMatrix m_FormMatrix;
563
564   void CalcBoundingBox();
565
566  protected:
567   void CopyData(const CPDF_PageObject* pSrcObject) override;
568 };
569
570 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_