Merge to XFA: Remove Release() combo patch.
[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 
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 
165 {
166 public:
167
168     CPDF_ColorStateData(): m_FillRGB(0), m_StrokeRGB(0) {}
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 
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     CPDF_Document*              m_pDocument;
224
225     FX_FLOAT                    m_FontSize;
226
227     FX_FLOAT                    m_CharSpace;
228
229     FX_FLOAT                    m_WordSpace;
230
231     FX_FLOAT            m_Matrix[4];
232
233     int                                 m_TextMode;
234
235     FX_FLOAT            m_CTM[4];
236 };
237 class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>
238 {
239 public:
240
241     CPDF_Font*                  GetFont() const
242     {
243         return m_pObject->m_pFont;
244     }
245
246     void                                SetFont(CPDF_Font* pFont);
247
248     FX_FLOAT                    GetFontSize() const
249     {
250         return m_pObject->m_FontSize;
251     }
252
253     FX_FLOAT*                   GetMatrix() const
254     {
255         return m_pObject->m_Matrix;
256     }
257
258
259
260     FX_FLOAT                    GetFontSizeV() const;
261
262     FX_FLOAT                    GetFontSizeH() const;
263
264     FX_FLOAT                    GetBaselineAngle() const;
265
266     FX_FLOAT                    GetShearAngle() const;
267
268 };
269 class CPDF_TransferFunc;
270 class CPDF_GeneralStateData 
271 {
272 public:
273
274     CPDF_GeneralStateData();
275
276     CPDF_GeneralStateData(const CPDF_GeneralStateData& src);
277     ~CPDF_GeneralStateData();
278
279     void                                SetBlendMode(FX_BSTR blend_mode);
280
281     char                                m_BlendMode[16];
282
283     int                                 m_BlendType;
284
285     CPDF_Object*                m_pSoftMask;
286
287     FX_FLOAT                    m_SMaskMatrix[6];
288
289     FX_FLOAT                    m_StrokeAlpha;
290
291     FX_FLOAT                    m_FillAlpha;
292
293     CPDF_Object*                m_pTR;
294
295     CPDF_TransferFunc*  m_pTransferFunc;
296
297     CFX_Matrix                  m_Matrix;
298
299     int                                 m_RenderIntent;
300
301     FX_BOOL                             m_StrokeAdjust;
302
303     FX_BOOL                             m_AlphaSource;
304
305     FX_BOOL                             m_TextKnockout;
306
307     FX_BOOL                             m_StrokeOP;
308
309     FX_BOOL                             m_FillOP;
310
311     int                                 m_OPMode;
312
313     CPDF_Object*                m_pBG;
314
315     CPDF_Object*                m_pUCR;
316
317     CPDF_Object*                m_pHT;
318
319     FX_FLOAT                    m_Flatness;
320
321     FX_FLOAT                    m_Smoothness;
322 };
323 class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>
324 {
325 public:
326
327     void                                SetRenderIntent(const CFX_ByteString& ri);
328
329     int                                 GetBlendType() const
330     {
331         return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;
332     }
333
334     int                                 GetAlpha(FX_BOOL bStroke) const
335     {
336         return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255) : 255;
337     }
338 };
339 class CPDF_ContentMarkItem 
340 {
341 public:
342
343     typedef enum {
344         None,
345         PropertiesDict,
346         DirectDict,
347         MCID
348     } ParamType;
349
350     CPDF_ContentMarkItem();
351
352     CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);
353
354     ~CPDF_ContentMarkItem();
355
356     inline const CFX_ByteString&        GetName() const
357     {
358         return m_MarkName;
359     }
360
361     inline ParamType    GetParamType() const
362     {
363         return m_ParamType;
364     }
365
366     inline void*                GetParam() const
367     {
368         return m_pParam;
369     }
370
371     inline FX_BOOL              HasMCID() const;
372
373     inline void                 SetName(const CFX_ByteString& name)
374     {
375         m_MarkName = name;
376     }
377
378     inline void                 SetParam(ParamType type, void* param)
379     {
380         m_ParamType = type;
381         m_pParam = param;
382     }
383 private:
384
385     CFX_ByteString              m_MarkName;
386
387     ParamType                   m_ParamType;
388
389     void*                               m_pParam;
390 };
391 class CPDF_ContentMarkData 
392 {
393 public:
394
395     CPDF_ContentMarkData() { }
396
397     CPDF_ContentMarkData(const CPDF_ContentMarkData& src);
398
399     inline int                  CountItems() const
400     {
401         return m_Marks.GetSize();
402     }
403
404     inline CPDF_ContentMarkItem&        GetItem(int index) const
405     {
406         return m_Marks[index];
407     }
408
409     int                                 GetMCID() const;
410
411     void                                AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDictNeedClone);
412
413     void                                DeleteLastMark();
414 private:
415
416     CFX_ObjectArray<CPDF_ContentMarkItem>       m_Marks;
417 };
418 class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>
419 {
420 public:
421
422     int                                 GetMCID() const
423     {
424         return m_pObject ? m_pObject->GetMCID() : -1;
425     }
426
427     FX_BOOL                             HasMark(FX_BSTR mark) const;
428
429     FX_BOOL                             LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const;
430 };
431 #define PDFPAGE_TEXT            1
432 #define PDFPAGE_PATH            2
433 #define PDFPAGE_IMAGE           3
434 #define PDFPAGE_SHADING         4
435 #define PDFPAGE_FORM            5
436 #define PDFPAGE_INLINES         6
437 class CPDF_GraphicStates 
438 {
439 public:
440
441     void                                CopyStates(const CPDF_GraphicStates& src);
442
443     void                                DefaultStates();
444
445     CPDF_ClipPath               m_ClipPath;
446
447     CPDF_GraphState             m_GraphState;
448
449     CPDF_ColorState             m_ColorState;
450
451     CPDF_TextState              m_TextState;
452
453     CPDF_GeneralState   m_GeneralState;
454 };
455 class CPDF_PageObject : public CPDF_GraphicStates
456 {
457 public:
458     static CPDF_PageObject* Create(int type);
459     virtual ~CPDF_PageObject();
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 };
507 struct CPDF_TextObjectItem  {
508
509     FX_DWORD                    m_CharCode;
510
511     FX_FLOAT                    m_OriginX;
512
513     FX_FLOAT                    m_OriginY;
514 };
515 class CPDF_TextObject : public CPDF_PageObject
516 {
517 public:
518
519     CPDF_TextObject();
520
521     virtual ~CPDF_TextObject();
522
523     int                                 CountItems() const
524     {
525         return m_nChars;
526     }
527
528     void                                GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;
529
530     int                                 CountChars() const;
531
532     void                                GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;
533     void                                GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;
534
535     void                                GetCharRect(int index, CFX_FloatRect& rect) const;
536
537
538     FX_FLOAT                    GetCharWidth(FX_DWORD charcode) const;
539     FX_FLOAT                    GetSpaceCharWidth() const;
540
541     FX_FLOAT                    GetPosX() const
542     {
543         return m_PosX;
544     }
545
546     FX_FLOAT                    GetPosY() const
547     {
548         return m_PosY;
549     }
550
551     void                                GetTextMatrix(CFX_AffineMatrix* pMatrix) const;
552
553     CPDF_Font*                  GetFont() const
554     {
555         return m_TextState.GetFont();
556     }
557
558     FX_FLOAT                    GetFontSize() const
559     {
560         return m_TextState.GetFontSize();
561     }
562
563     void                                SetEmpty();
564
565     void                                SetText(const CFX_ByteString& text);
566
567     void                                SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
568
569     void                                SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);
570
571     void                                SetPosition(FX_FLOAT x, FX_FLOAT y);
572
573     void                                SetTextState(CPDF_TextState TextState);
574     virtual void                Transform(const CFX_AffineMatrix& matrix);
575
576     void                                CalcCharPos(FX_FLOAT* pPosArray) const;
577
578
579
580     void                                SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);
581
582     void                                GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)
583     {
584         nChars = m_nChars;
585         pCharCodes = m_pCharCodes;
586         pCharPos = m_pCharPos;
587     }
588
589
590     void                                RecalcPositionData()
591     {
592         CalcPositionData(NULL, NULL, 1);
593     }
594 protected:
595     virtual void                CopyData(const CPDF_PageObject* pSrcObject);
596
597     FX_FLOAT                    m_PosX;
598
599     FX_FLOAT                    m_PosY;
600
601     int                                 m_nChars;
602
603     FX_DWORD*                   m_pCharCodes;
604
605     FX_FLOAT*           m_pCharPos;
606
607     void                                SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
608
609     void                                CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);
610     friend class                CPDF_StreamContentParser;
611     friend class                CPDF_RenderStatus;
612     friend class                CPDF_QuickDrawer;
613     friend class                CPDF_TextRenderer;
614     friend class                CTextPage;
615     friend class                CPDF_ContentGenerator;
616 };
617 class CPDF_PathObject : public CPDF_PageObject
618 {
619 public:
620
621     CPDF_PathObject()
622     {
623         m_Type = PDFPAGE_PATH;
624     }
625
626     virtual ~CPDF_PathObject() {}
627     virtual void                Transform(const CFX_AffineMatrix& maxtrix);
628
629     void                                SetGraphState(CPDF_GraphState GraphState);
630
631     CPDF_Path                   m_Path;
632
633     int                                 m_FillType;
634
635     FX_BOOL                             m_bStroke;
636
637     CFX_AffineMatrix    m_Matrix;
638
639
640     void                                CalcBoundingBox();
641 protected:
642     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
643 };
644 class CPDF_ImageObject : public CPDF_PageObject
645 {
646 public:
647
648     CPDF_ImageObject();
649
650     virtual ~CPDF_ImageObject();
651     virtual void                Transform(const CFX_AffineMatrix& matrix);
652
653     CPDF_Image*                 m_pImage;
654
655     CFX_AffineMatrix    m_Matrix;
656
657     void                                CalcBoundingBox();
658 private:
659     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
660 };
661 class CPDF_ShadingObject : public CPDF_PageObject
662 {
663 public:
664
665     CPDF_ShadingObject();
666
667     virtual ~CPDF_ShadingObject();
668
669     CPDF_ShadingPattern*        m_pShading;
670
671     CFX_AffineMatrix    m_Matrix;
672
673     CPDF_Page*                  m_pPage;
674     virtual void                Transform(const CFX_AffineMatrix& matrix);
675
676     void                                CalcBoundingBox();
677 protected:
678     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
679 };
680 class CPDF_FormObject : public CPDF_PageObject
681 {
682 public:
683
684     CPDF_FormObject()
685     {
686         m_Type = PDFPAGE_FORM;
687         m_pForm = NULL;
688     }
689
690     virtual ~CPDF_FormObject();
691     virtual void                Transform(const CFX_AffineMatrix& matrix);
692
693     CPDF_Form*                  m_pForm;
694
695     CFX_AffineMatrix    m_FormMatrix;
696
697     void                                CalcBoundingBox();
698 protected:
699     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
700 };
701 class CPDF_InlineImages : public CPDF_PageObject
702 {
703 public:
704
705     CPDF_InlineImages();
706
707     virtual ~CPDF_InlineImages();
708
709     CPDF_Stream*                m_pStream;
710
711     CFX_DIBitmap*               m_pBitmap;
712
713     CFX_ArrayTemplate<CFX_AffineMatrix> m_Matrices;
714
715     void                                AddMatrix(CFX_AffineMatrix& matrix);
716 protected:
717     virtual void                Transform(const CFX_AffineMatrix& matrix) {}
718     virtual void                CopyData(const CPDF_PageObject* pSrcObjet) {}
719 };
720 #endif