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