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
15class CPDF_Path;
16class CPDF_ClipPathData;
17class CPDF_ClipPath;
18class CPDF_ColorStateData;
19class CPDF_ColorState;
20class CPDF_GraphState;
21class CPDF_TextStateData;
22class CPDF_TextState;
23class CPDF_GeneralStateData;
24class CPDF_GeneralState;
25class CPDF_ContentMarkItem;
26class CPDF_ContentMark;
27class CPDF_GraphicStates;
28class CPDF_PageObject;
29class CPDF_TextObject;
30class CPDF_PathObject;
31class CPDF_ImageObject;
32class CPDF_ShadingObject;
33class CPDF_FormObject;
34class CPDF_InlineImages;
35typedef CFX_PathData CPDF_PathData;
36class CPDF_Path : public CFX_CountRef<CFX_PathData>
37{
38public:
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};
102class CPDF_ClipPathData : public CFX_Object
103{
104public:
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);
113public:
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};
125class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData>
126{
127public:
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};
164class CPDF_ColorStateData : public CFX_Object
165{
166public:
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};
182class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData>
183{
184public:
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);
203private:
204    void				SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
205};
206typedef CFX_GraphStateData CPDF_GraphStateData;
207class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData>
208{
209public:
210};
211class CPDF_TextStateData : public CFX_Object
212{
213public:
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};
235class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>
236{
237public:
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};
267class CPDF_TransferFunc;
268class CPDF_GeneralStateData : public CFX_Object
269{
270public:
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};
321class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>
322{
323public:
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};
337class CPDF_ContentMarkItem : public CFX_Object
338{
339public:
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    }
381private:
382
383    CFX_ByteString		m_MarkName;
384
385    ParamType			m_ParamType;
386
387    void*				m_pParam;
388};
389class CPDF_ContentMarkData : public CFX_Object
390{
391public:
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();
412private:
413
414    CFX_ObjectArray<CPDF_ContentMarkItem>	m_Marks;
415};
416class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>
417{
418public:
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
435class CPDF_GraphicStates : public CFX_Object
436{
437public:
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};
453class CPDF_PageObject : public CPDF_GraphicStates
454{
455public:
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;
498protected:
499
500    virtual void		CopyData(const CPDF_PageObject* pSrcObject) {}
501
502    void				RecalcBBox();
503
504    CPDF_PageObject() {}
505
506    virtual ~CPDF_PageObject() {}
507};
508struct CPDF_TextObjectItem : public CFX_Object {
509
510    FX_DWORD			m_CharCode;
511
512    FX_FLOAT			m_OriginX;
513
514    FX_FLOAT			m_OriginY;
515};
516class CPDF_TextObject : public CPDF_PageObject
517{
518public:
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    }
595protected:
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};
618class CPDF_PathObject : public CPDF_PageObject
619{
620public:
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();
642protected:
643    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
644};
645class CPDF_ImageObject : public CPDF_PageObject
646{
647public:
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();
659private:
660    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
661};
662class CPDF_ShadingObject : public CPDF_PageObject
663{
664public:
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();
678protected:
679    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
680};
681class CPDF_FormObject : public CPDF_PageObject
682{
683public:
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();
699protected:
700    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
701};
702class CPDF_InlineImages : public CPDF_PageObject
703{
704public:
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);
717protected:
718    virtual void		Transform(const CFX_AffineMatrix& matrix) {}
719    virtual void		CopyData(const CPDF_PageObject* pSrcObjet) {}
720};
721#endif
722