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