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