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