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