merge to XFA: Fix -Wnon-virtual-dtor compiler warnings.
[pdfium.git] / core / include / fxge / fx_ge.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 _FX_GE_H_
8 #define _FX_GE_H_
9 #ifndef _FX_DIB_H_
10 #include "fx_dib.h"
11 #endif
12 #ifndef _FX_FONT_H_
13 #include "fx_font.h"
14 #endif
15 class CFX_ClipRgn;
16 class CFX_PathData;
17 class CFX_GraphStateData;
18 class CFX_Font;
19 class CFX_FontMgr;
20 class CFX_FontCache;
21 class CFX_FaceCache;
22 class CFX_RenderDevice;
23 class IFX_RenderDeviceDriver;
24 class CCodec_ModuleMgr;
25 class IFXG_PaintModuleMgr;
26 class CFX_GEModule : public CFX_Object
27 {
28 public:
29
30     static void                         Create();
31
32     static void                         Use(CFX_GEModule* pMgr);
33
34     static CFX_GEModule*        Get();
35
36     static void                         Destroy();
37 public:
38
39     CFX_FontCache*                      GetFontCache();
40     CFX_FontMgr*                        GetFontMgr()
41     {
42         return m_pFontMgr;
43     }
44     void                                        SetTextGamma(FX_FLOAT gammaValue);
45     FX_LPCBYTE                          GetTextGammaTable();
46     void                                        SetExtFontMapper(IFX_FontMapper* pFontMapper);
47
48     void                                        SetCodecModule(CCodec_ModuleMgr* pCodecModule)
49     {
50         m_pCodecModule = pCodecModule;
51     }
52     CCodec_ModuleMgr*           GetCodecModule()
53     {
54         return m_pCodecModule;
55     }
56     FXFT_Library                        m_FTLibrary;
57     void*                                       GetPlatformData()
58     {
59         return m_pPlatformData;
60     }
61 protected:
62
63     CFX_GEModule();
64
65     ~CFX_GEModule();
66     void                                        InitPlatform();
67     void                                        DestroyPlatform();
68 private:
69     FX_BYTE                                     m_GammaValue[256];
70     CFX_FontCache*                      m_pFontCache;
71     CFX_FontMgr*                        m_pFontMgr;
72     CCodec_ModuleMgr*           m_pCodecModule;
73     void*                                       m_pPlatformData;
74 };
75 typedef struct {
76
77     FX_FLOAT                    m_PointX;
78
79     FX_FLOAT                    m_PointY;
80
81     int                                 m_Flag;
82 } FX_PATHPOINT;
83 #define FXPT_CLOSEFIGURE                0x01
84 #define FXPT_LINETO                             0x02
85 #define FXPT_BEZIERTO                   0x04
86 #define FXPT_MOVETO                             0x06
87 #define FXPT_TYPE                               0x06
88 #define FXFILL_ALTERNATE                1
89 #define FXFILL_WINDING                  2
90 class CFX_ClipRgn : public CFX_Object
91 {
92 public:
93
94     CFX_ClipRgn(int device_width, int device_height);
95
96     CFX_ClipRgn(const FX_RECT& rect);
97
98     CFX_ClipRgn(const CFX_ClipRgn& src);
99
100     ~CFX_ClipRgn();
101
102     typedef enum {
103         RectI,
104         MaskF
105     } ClipType;
106
107     void                        Reset(const FX_RECT& rect);
108
109     ClipType            GetType() const
110     {
111         return m_Type;
112     }
113
114     const FX_RECT&      GetBox() const
115     {
116         return m_Box;
117     }
118
119     CFX_DIBitmapRef     GetMask() const
120     {
121         return m_Mask;
122     }
123
124     void                        IntersectRect(const FX_RECT& rect);
125
126     void                        IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);
127 protected:
128
129     ClipType            m_Type;
130
131     FX_RECT                     m_Box;
132
133     CFX_DIBitmapRef     m_Mask;
134
135     void                        IntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask);
136 };
137 extern const FX_BYTE g_GammaRamp[256];
138 extern const FX_BYTE g_GammaInverse[256];
139 #define FX_GAMMA(value)                 (value)
140 #define FX_GAMMA_INVERSE(value) (value)
141 inline FX_ARGB ArgbGamma(FX_ARGB argb)
142 {
143     return argb;
144 }
145 inline FX_ARGB ArgbGammaInverse(FX_ARGB argb)
146 {
147     return argb;
148 }
149 class CFX_PathData : public CFX_Object
150 {
151 public:
152
153     CFX_PathData();
154
155     CFX_PathData(const CFX_PathData& src);
156
157     ~CFX_PathData();
158
159
160
161
162     int                                 GetPointCount() const
163     {
164         return m_PointCount;
165     }
166
167     int                                 GetFlag(int index) const
168     {
169         return m_pPoints[index].m_Flag;
170     }
171
172     FX_FLOAT                    GetPointX(int index) const
173     {
174         return m_pPoints[index].m_PointX;
175     }
176
177     FX_FLOAT                    GetPointY(int index) const
178     {
179         return m_pPoints[index].m_PointY;
180     }
181
182
183
184     FX_PATHPOINT*               GetPoints() const
185     {
186         return m_pPoints;
187     }
188
189     FX_BOOL                             SetPointCount(int nPoints);
190
191     FX_BOOL                             AllocPointCount(int nPoints);
192
193     FX_BOOL                             AddPointCount(int addPoints);
194
195     CFX_FloatRect               GetBoundingBox() const;
196
197     CFX_FloatRect               GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;
198
199     void                                Transform(const CFX_AffineMatrix* pMatrix);
200
201     FX_BOOL                             IsRect() const;
202
203     FX_BOOL                             GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const;
204
205     FX_BOOL                             IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* rect) const;
206
207     FX_BOOL                             Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix);
208
209     FX_BOOL                             AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);
210
211     void                                SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag);
212
213     void                                TrimPoints(int nPoints);
214
215     FX_BOOL                             Copy(const CFX_PathData &src);
216 protected:
217     friend class                CPDF_Path;
218
219     int                                 m_PointCount;
220
221     FX_PATHPOINT*               m_pPoints;
222
223     int                                 m_AllocCount;
224 };
225 class CFX_GraphStateData : public CFX_Object
226 {
227 public:
228
229     CFX_GraphStateData();
230
231     CFX_GraphStateData(const CFX_GraphStateData& src);
232
233     ~CFX_GraphStateData();
234
235     void                                Copy(const CFX_GraphStateData& src);
236
237     void                                SetDashCount(int count);
238
239
240
241     typedef enum {
242         LineCapButt = 0,
243         LineCapRound = 1,
244         LineCapSquare = 2
245     } LineCap;
246     LineCap                             m_LineCap;
247     int                                 m_DashCount;
248     FX_FLOAT*           m_DashArray;
249     FX_FLOAT                    m_DashPhase;
250
251     typedef enum {
252         LineJoinMiter = 0,
253         LineJoinRound = 1,
254         LineJoinBevel = 2,
255     } LineJoin;
256     LineJoin                    m_LineJoin;
257     FX_FLOAT                    m_MiterLimit;
258     FX_FLOAT                    m_LineWidth;
259
260 };
261 #define FXDC_DEVICE_CLASS                       1
262 #define FXDC_PIXEL_WIDTH                        2
263 #define FXDC_PIXEL_HEIGHT                       3
264 #define FXDC_BITS_PIXEL                         4
265 #define FXDC_HORZ_SIZE                          5
266 #define FXDC_VERT_SIZE                          6
267 #define FXDC_RENDER_CAPS                        7
268 #define FXDC_DITHER_BITS                        8
269 #define FXDC_DISPLAY                            1
270 #define FXDC_PRINTER                            2
271 #define FXRC_GET_BITS                           0x01
272 #define FXRC_BIT_MASK                           0x02
273 #define FXRC_ALPHA_MASK                         0x04
274 #define FXRC_ALPHA_PATH                         0x10
275 #define FXRC_ALPHA_IMAGE                        0x20
276 #define FXRC_ALPHA_OUTPUT                       0x40
277 #define FXRC_BLEND_MODE                         0x80
278 #define FXRC_SOFT_CLIP                          0x100
279 #define FXRC_CMYK_OUTPUT                        0x200
280 #define FXRC_BITMASK_OUTPUT         0x400
281 #define FXRC_BYTEMASK_OUTPUT        0x800
282 #define FXRENDER_IMAGE_LOSSY            0x1000
283 #define FXFILL_ALTERNATE                1
284 #define FXFILL_WINDING                  2
285 #define FXFILL_FULLCOVER                4
286 #define FXFILL_RECT_AA                  8
287 #define FX_FILL_STROKE                  16
288 #define FX_STROKE_ADJUST                32
289 #define FX_STROKE_TEXT_MODE             64
290 #define FX_FILL_TEXT_MODE               128
291 #define FX_ZEROAREA_FILL                256
292 #define FXFILL_NOPATHSMOOTH             512
293 #define FXTEXT_CLEARTYPE                        0x01
294 #define FXTEXT_BGR_STRIPE                       0x02
295 #define FXTEXT_PRINTGRAPHICTEXT         0x04
296 #define FXTEXT_NO_NATIVETEXT            0x08
297 #define FXTEXT_PRINTIMAGETEXT           0x10
298 #define FXTEXT_NOSMOOTH                         0x20
299 typedef struct {
300     FX_DWORD                    m_GlyphIndex;
301     FX_FLOAT                    m_OriginX, m_OriginY;
302     int                                 m_FontCharWidth;
303     FX_BOOL                             m_bGlyphAdjust;
304     FX_FLOAT                    m_AdjustMatrix[4];
305     FX_DWORD                    m_ExtGID;
306     FX_BOOL                             m_bFontStyle;
307 } FXTEXT_CHARPOS;
308 class CFX_RenderDevice : public CFX_Object
309 {
310 public:
311     CFX_RenderDevice();
312
313     virtual ~CFX_RenderDevice();
314
315     void                        SetDeviceDriver(IFX_RenderDeviceDriver* pDriver);
316
317     IFX_RenderDeviceDriver*     GetDeviceDriver() const
318     {
319         return m_pDeviceDriver;
320     }
321
322     FX_BOOL                     StartRendering();
323
324     void                        EndRendering();
325
326
327
328     void                        SaveState();
329
330     void                        RestoreState(FX_BOOL bKeepSaved = FALSE);
331
332
333
334
335     int                         GetWidth() const
336     {
337         return m_Width;
338     }
339
340     int                         GetHeight() const
341     {
342         return m_Height;
343     }
344
345     int                         GetDeviceClass() const
346     {
347         return m_DeviceClass;
348     }
349
350     int                         GetBPP() const
351     {
352         return m_bpp;
353     }
354
355     int                         GetRenderCaps() const
356     {
357         return m_RenderCaps;
358     }
359
360     int                         GetDeviceCaps(int id) const;
361
362     CFX_Matrix          GetCTM() const;
363
364
365     CFX_DIBitmap*       GetBitmap() const
366     {
367         return m_pBitmap;
368     }
369     void                        SetBitmap(CFX_DIBitmap* pBitmap)
370     {
371         m_pBitmap = pBitmap;
372     }
373
374     FX_BOOL                     CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const;
375
376     const FX_RECT&      GetClipBox() const
377     {
378         return m_ClipBox;
379     }
380
381     FX_BOOL                     SetClip_PathFill(const CFX_PathData* pPathData,
382                                      const CFX_AffineMatrix* pObject2Device,
383                                      int fill_mode
384                               );
385
386     FX_BOOL                     SetClip_Rect(const FX_RECT* pRect);
387
388     FX_BOOL                     SetClip_PathStroke(const CFX_PathData* pPathData,
389                                        const CFX_AffineMatrix* pObject2Device,
390                                        const CFX_GraphStateData* pGraphState
391                                 );
392
393     FX_BOOL                     DrawPath(const CFX_PathData* pPathData,
394                              const CFX_AffineMatrix* pObject2Device,
395                              const CFX_GraphStateData* pGraphState,
396                              FX_DWORD fill_color,
397                              FX_DWORD stroke_color,
398                              int fill_mode,
399                              int alpha_flag = 0,
400                              void* pIccTransform = NULL,
401                              int blend_type = FXDIB_BLEND_NORMAL
402                       );
403
404     FX_BOOL                     SetPixel(int x, int y, FX_DWORD color,
405                              int alpha_flag = 0, void* pIccTransform = NULL);
406
407     FX_BOOL                     FillRect(const FX_RECT* pRect, FX_DWORD color,
408                              int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
409
410     FX_BOOL                     DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
411                                      int fill_mode = 0, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
412
413     FX_BOOL                     GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL);
414
415     CFX_DIBitmap*   GetBackDrop();
416
417     FX_BOOL                     SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_type = FXDIB_BLEND_NORMAL,
418                               void* pIccTransform = NULL);
419
420     FX_BOOL                     StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,
421                                   FX_DWORD flags = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
422
423     FX_BOOL                     SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD color,
424                                int alpha_flag = 0, void* pIccTransform = NULL);
425
426     FX_BOOL                     StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,
427                                    FX_DWORD color, FX_DWORD flags = 0, int alpha_flag = 0, void* pIccTransform = NULL);
428
429     FX_BOOL                     StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
430                                 const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
431                                 int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
432
433     FX_BOOL                     ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);
434
435     void                        CancelDIBits(FX_LPVOID handle);
436
437     FX_BOOL                     DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
438                                    CFX_Font* pFont, CFX_FontCache* pCache,
439                                    FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
440                                    FX_DWORD fill_color, FX_DWORD text_flags,
441                                    int alpha_flag = 0, void* pIccTransform = NULL);
442
443     FX_BOOL                     DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
444                                  CFX_Font* pFont, CFX_FontCache* pCache,
445                                  FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
446                                  const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
447                                  FX_DWORD fill_color, FX_DWORD stroke_color, CFX_PathData* pClippingPath, int nFlag = 0,
448                                  int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
449     virtual void Begin() {}
450     virtual void End() {}
451 private:
452
453     CFX_DIBitmap*       m_pBitmap;
454
455
456
457     int                         m_Width;
458
459     int                         m_Height;
460
461     int                         m_bpp;
462
463     int                         m_RenderCaps;
464
465     int                         m_DeviceClass;
466
467     FX_RECT                     m_ClipBox;
468
469 protected:
470
471     IFX_RenderDeviceDriver*     m_pDeviceDriver;
472 private:
473
474     void                        InitDeviceInfo();
475
476     void                        UpdateClipBox();
477 };
478 class CFX_FxgeDevice : public CFX_RenderDevice
479 {
480 public:
481
482     CFX_FxgeDevice();
483
484     ~CFX_FxgeDevice();
485
486     FX_BOOL                     Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
487
488     FX_BOOL                     Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);
489 protected:
490
491     FX_BOOL                     m_bOwnedBitmap;
492 };
493 class CFX_SkiaDevice : public CFX_RenderDevice
494 {
495 public:
496
497     CFX_SkiaDevice();
498
499     ~CFX_SkiaDevice();
500
501     FX_BOOL                     Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
502
503     FX_BOOL                     Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);
504 protected:
505
506     FX_BOOL                     m_bOwnedBitmap;
507 };
508 class IFX_RenderDeviceDriver : public CFX_Object
509 {
510 public:
511
512     static IFX_RenderDeviceDriver*              CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder = FALSE,
513             CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
514
515     virtual ~IFX_RenderDeviceDriver() {}
516     virtual void Begin() { }
517     virtual void End() { }
518
519     virtual int         GetDeviceCaps(int caps_id) = 0;
520
521     virtual CFX_Matrix  GetCTM() const
522     {
523         return CFX_Matrix();
524     }
525
526     virtual FX_BOOL IsPSPrintDriver()
527     {
528         return FALSE;
529     }
530
531     virtual FX_BOOL     StartRendering()
532     {
533         return TRUE;
534     }
535
536     virtual void        EndRendering() {}
537
538
539
540
541     virtual void        SaveState() = 0;
542
543     virtual void        RestoreState(FX_BOOL bKeepSaved = FALSE) = 0;
544
545
546     virtual FX_BOOL     SetClip_PathFill(const CFX_PathData* pPathData,
547                                      const CFX_AffineMatrix* pObject2Device,
548                                      int fill_mode
549                                     ) = 0;
550
551     virtual FX_BOOL     SetClip_PathStroke(const CFX_PathData* pPathData,
552                                        const CFX_AffineMatrix* pObject2Device,
553                                        const CFX_GraphStateData* pGraphState
554                                       )
555     {
556         return FALSE;
557     }
558
559     virtual FX_BOOL     DrawPath(const CFX_PathData* pPathData,
560                              const CFX_AffineMatrix* pObject2Device,
561                              const CFX_GraphStateData* pGraphState,
562                              FX_DWORD fill_color,
563                              FX_DWORD stroke_color,
564                              int fill_mode,
565                              int alpha_flag = 0,
566                              void* pIccTransform = NULL,
567                              int blend_type = FXDIB_BLEND_NORMAL
568                             ) = 0;
569
570     virtual FX_BOOL     SetPixel(int x, int y, FX_DWORD color,
571                              int alpha_flag = 0, void* pIccTransform = NULL)
572     {
573         return FALSE;
574     }
575
576     virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
577                              int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)
578     {
579         return FALSE;
580     }
581
582     virtual FX_BOOL     DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
583                                      int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)
584     {
585         return FALSE;
586     }
587
588     virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;
589
590     virtual FX_BOOL     GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE)
591     {
592         return FALSE;
593     }
594     virtual CFX_DIBitmap*   GetBackDrop()
595     {
596         return NULL;
597     }
598
599     virtual FX_BOOL     SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
600                               int dest_left, int dest_top, int blend_type,
601                               int alpha_flag = 0, void* pIccTransform = NULL) = 0;
602
603     virtual FX_BOOL     StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
604                                   int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
605                                   int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;
606
607     virtual FX_BOOL     StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
608                                 const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
609                                 int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;
610
611     virtual FX_BOOL     ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
612     {
613         return FALSE;
614     }
615
616     virtual void        CancelDIBits(FX_LPVOID handle) {}
617
618     virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
619                                    CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
620                                    int alpha_flag = 0, void* pIccTransform = NULL)
621     {
622         return FALSE;
623     }
624
625     virtual void*       GetPlatformSurface()
626     {
627         return NULL;
628     }
629
630     virtual int         GetDriverType()
631     {
632         return 0;
633     }
634
635     virtual void    ClearDriver() {}
636 };
637 class IFX_PSOutput
638 {
639 public:
640     virtual void  Release() = 0;
641     virtual void        OutputPS(FX_LPCSTR string, int len) = 0;
642
643 protected:
644     ~IFX_PSOutput() { }
645 };
646 class CPSFont;
647 class CFX_PSRenderer : public CFX_Object
648 {
649 public:
650
651     CFX_PSRenderer();
652
653     ~CFX_PSRenderer();
654
655     void                        Init(IFX_PSOutput* pOutput, int ps_level, int width, int height, FX_BOOL bCmykOutput);
656     FX_BOOL                     StartRendering();
657     void                        EndRendering();
658
659     void                        SaveState();
660
661     void                        RestoreState(FX_BOOL bKeepSaved = FALSE);
662
663     void                        SetClip_PathFill(const CFX_PathData* pPathData,
664                                      const CFX_AffineMatrix* pObject2Device,
665                                      int fill_mode
666                            );
667
668     void                        SetClip_PathStroke(const CFX_PathData* pPathData,
669                                        const CFX_AffineMatrix* pObject2Device,
670                                        const CFX_GraphStateData* pGraphState
671                              );
672
673     FX_RECT                     GetClipBox()
674     {
675         return m_ClipBox;
676     }
677
678     FX_BOOL                     DrawPath(const CFX_PathData* pPathData,
679                              const CFX_AffineMatrix* pObject2Device,
680                              const CFX_GraphStateData* pGraphState,
681                              FX_DWORD fill_color,
682                              FX_DWORD stroke_color,
683                              int fill_mode,
684                              int alpha_flag = 0,
685                              void* pIccTransform = NULL
686                       );
687
688     FX_BOOL                     SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
689                               int alpha_flag = 0, void* pIccTransform = NULL);
690
691     FX_BOOL                     StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
692                                   int dest_width, int dest_height, FX_DWORD flags,
693                                   int alpha_flag = 0, void* pIccTransform = NULL);
694
695     FX_BOOL                     DrawDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color,
696                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
697                                int alpha_flag = 0, void* pIccTransform = NULL);
698
699     FX_BOOL                     DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, CFX_FontCache* pCache,
700                              const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
701                              int alpha_flag = 0, void* pIccTransform = NULL);
702 private:
703
704     IFX_PSOutput*       m_pOutput;
705
706     int                         m_PSLevel;
707
708     CFX_GraphStateData  m_CurGraphState;
709
710     FX_BOOL                     m_bGraphStateSet;
711
712     FX_BOOL                     m_bCmykOutput;
713
714     FX_BOOL                     m_bColorSet;
715
716     FX_DWORD            m_LastColor;
717
718     FX_RECT                     m_ClipBox;
719
720     CFX_ArrayTemplate<CPSFont*> m_PSFontList;
721
722     CFX_ArrayTemplate<FX_RECT>  m_ClipBoxStack;
723     FX_BOOL                     m_bInited;
724
725     void                        OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);
726
727     void                        SetGraphState(const CFX_GraphStateData* pGraphState);
728
729     void                        SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform);
730
731     void                        FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos, int& ps_fontnum, int &ps_glyphindex);
732
733     void                        WritePSBinary(FX_LPCBYTE data, int len);
734 };
735 #endif