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