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