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