f2112547915ca0be1e08e47678e3a6075573c793
[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(): 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 : 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     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 : public CFX_Object
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 : public CFX_Object
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 : public CFX_Object
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 : public CFX_Object
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
459     static CPDF_PageObject* Create(int type);
460
461     void                                Release();
462
463     CPDF_PageObject*    Clone() const;
464
465     void                                Copy(const CPDF_PageObject* pSrcObject);
466
467     virtual void                Transform(const CFX_AffineMatrix& matrix) = 0;
468
469
470
471     void                                RemoveClipPath();
472
473     void                                AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
474
475     void                                CopyClipPath(CPDF_PageObject* pObj);
476
477     void                                TransformClipPath(CFX_AffineMatrix& matrix);
478
479     void                                TransformGeneralState(CFX_AffineMatrix& matrix);
480
481
482     void                                SetColorState(CPDF_ColorState state)
483     {
484         m_ColorState = state;
485     }
486
487     FX_RECT                             GetBBox(const CFX_AffineMatrix* pMatrix) const;
488
489     int                                 m_Type;
490
491     FX_FLOAT                    m_Left;
492
493     FX_FLOAT                    m_Right;
494
495     FX_FLOAT                    m_Top;
496
497     FX_FLOAT                    m_Bottom;
498
499     CPDF_ContentMark    m_ContentMark;
500 protected:
501
502     virtual void                CopyData(const CPDF_PageObject* pSrcObject) {}
503
504     void                                RecalcBBox();
505
506     CPDF_PageObject() {}
507
508     virtual ~CPDF_PageObject() {}
509 };
510 struct CPDF_TextObjectItem : public CFX_Object {
511
512     FX_DWORD                    m_CharCode;
513
514     FX_FLOAT                    m_OriginX;
515
516     FX_FLOAT                    m_OriginY;
517 };
518 class CPDF_TextObject : public CPDF_PageObject
519 {
520 public:
521
522     CPDF_TextObject();
523
524     virtual ~CPDF_TextObject();
525
526     int                                 CountItems() const
527     {
528         return m_nChars;
529     }
530
531     void                                GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;
532
533     int                                 CountChars() const;
534
535     void                                GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;
536     void                                GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;
537
538     void                                GetCharRect(int index, CFX_FloatRect& rect) const;
539
540
541     FX_FLOAT                    GetCharWidth(FX_DWORD charcode) const;
542     FX_FLOAT                    GetSpaceCharWidth() const;
543
544     FX_FLOAT                    GetPosX() const
545     {
546         return m_PosX;
547     }
548
549     FX_FLOAT                    GetPosY() const
550     {
551         return m_PosY;
552     }
553
554     void                                GetTextMatrix(CFX_AffineMatrix* pMatrix) const;
555
556     CPDF_Font*                  GetFont() const
557     {
558         return m_TextState.GetFont();
559     }
560
561     FX_FLOAT                    GetFontSize() const
562     {
563         return m_TextState.GetFontSize();
564     }
565
566     void                                SetEmpty();
567
568     void                                SetText(const CFX_ByteString& text);
569
570     void                                SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
571
572     void                                SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);
573
574     void                                SetPosition(FX_FLOAT x, FX_FLOAT y);
575
576     void                                SetTextState(CPDF_TextState TextState);
577     virtual void                Transform(const CFX_AffineMatrix& matrix);
578
579     void                                CalcCharPos(FX_FLOAT* pPosArray) const;
580
581
582
583     void                                SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);
584
585     void                                GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)
586     {
587         nChars = m_nChars;
588         pCharCodes = m_pCharCodes;
589         pCharPos = m_pCharPos;
590     }
591
592
593     void                                RecalcPositionData()
594     {
595         CalcPositionData(NULL, NULL, 1);
596     }
597 protected:
598     virtual void                CopyData(const CPDF_PageObject* pSrcObject);
599
600     FX_FLOAT                    m_PosX;
601
602     FX_FLOAT                    m_PosY;
603
604     int                                 m_nChars;
605
606     FX_DWORD*                   m_pCharCodes;
607
608     FX_FLOAT*           m_pCharPos;
609
610     void                                SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
611
612     void                                CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);
613     friend class                CPDF_StreamContentParser;
614     friend class                CPDF_RenderStatus;
615     friend class                CPDF_QuickDrawer;
616     friend class                CPDF_TextRenderer;
617     friend class                CTextPage;
618     friend class                CPDF_ContentGenerator;
619 };
620 class CPDF_PathObject : public CPDF_PageObject
621 {
622 public:
623
624     CPDF_PathObject()
625     {
626         m_Type = PDFPAGE_PATH;
627     }
628
629     virtual ~CPDF_PathObject() {}
630     virtual void                Transform(const CFX_AffineMatrix& maxtrix);
631
632     void                                SetGraphState(CPDF_GraphState GraphState);
633
634     CPDF_Path                   m_Path;
635
636     int                                 m_FillType;
637
638     FX_BOOL                             m_bStroke;
639
640     CFX_AffineMatrix    m_Matrix;
641
642
643     void                                CalcBoundingBox();
644 protected:
645     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
646 };
647 class CPDF_ImageObject : public CPDF_PageObject
648 {
649 public:
650
651     CPDF_ImageObject();
652
653     virtual ~CPDF_ImageObject();
654     virtual void                Transform(const CFX_AffineMatrix& matrix);
655
656     CPDF_Image*                 m_pImage;
657
658     CFX_AffineMatrix    m_Matrix;
659
660     void                                CalcBoundingBox();
661 private:
662     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
663 };
664 class CPDF_ShadingObject : public CPDF_PageObject
665 {
666 public:
667
668     CPDF_ShadingObject();
669
670     virtual ~CPDF_ShadingObject();
671
672     CPDF_ShadingPattern*        m_pShading;
673
674     CFX_AffineMatrix    m_Matrix;
675
676     CPDF_Page*                  m_pPage;
677     virtual void                Transform(const CFX_AffineMatrix& matrix);
678
679     void                                CalcBoundingBox();
680 protected:
681     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
682 };
683 class CPDF_FormObject : public CPDF_PageObject
684 {
685 public:
686
687     CPDF_FormObject()
688     {
689         m_Type = PDFPAGE_FORM;
690         m_pForm = NULL;
691     }
692
693     virtual ~CPDF_FormObject();
694     virtual void                Transform(const CFX_AffineMatrix& matrix);
695
696     CPDF_Form*                  m_pForm;
697
698     CFX_AffineMatrix    m_FormMatrix;
699
700     void                                CalcBoundingBox();
701 protected:
702     virtual void                CopyData(const CPDF_PageObject* pSrcObjet);
703 };
704 class CPDF_InlineImages : public CPDF_PageObject
705 {
706 public:
707
708     CPDF_InlineImages();
709
710     virtual ~CPDF_InlineImages();
711
712     CPDF_Stream*                m_pStream;
713
714     CFX_DIBitmap*               m_pBitmap;
715
716     CFX_ArrayTemplate<CFX_AffineMatrix> m_Matrices;
717
718     void                                AddMatrix(CFX_AffineMatrix& matrix);
719 protected:
720     virtual void                Transform(const CFX_AffineMatrix& matrix) {}
721     virtual void                CopyData(const CPDF_PageObject* pSrcObjet) {}
722 };
723 #endif