1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct  WINDIB_Open_Args_;
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CGdiplusExt
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CGdiplusExt();
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CGdiplusExt();
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void			Load();
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			IsAvailable()
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_hModule != NULL;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			DrawPath(HDC hDC, const CFX_PathData* pPathData,
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_AffineMatrix* pObject2Device,
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_GraphStateData* pGraphState,
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD fill_argb,
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD stroke_argb,
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int fill_mode
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      );
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*			LoadMemFont(FX_BYTE* pData, FX_DWORD size);
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void			DeleteMemFont(void* pFontCollection);
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdipCreateFromImage(void* bitmap, void** graphics);
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDeleteGraphics(void* graphics);
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipSetTextRenderingHint(void* graphics, int mode);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipSetPageUnit(void* graphics, FX_DWORD unit);
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipSetWorldTransform(void* graphics, void* pMatrix);
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdipDrawDriverString(void *graphics,  unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDeleteBrush(void* pBrush);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDeleteMatrix(void* matrix);
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDeleteFontFamily(void* pFamily);
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*           GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDeleteFont(void* pFont);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipDisposeImage(void* bitmap);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void            GdipGetFontSize(void *pFont, FX_FLOAT *size);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*           GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL         GdiRemoveFontMemResourceEx(void* handle);
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*			m_Functions[100];
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*           m_pGdiAddFontMemResourceEx;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*           m_pGdiRemoveFontMemResourseEx;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DIBitmap*	LoadDIBitmap(WINDIB_Open_Args_ args);
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HMODULE			m_hModule;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HMODULE         m_GdiModule;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "dwrite_int.h"
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CWin32Platform : public CFX_Object
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			m_bHalfTone;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CGdiplusExt		m_GdiplusExt;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CDWriteExt      m_DWriteExt;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CGdiDeviceDriver : public IFX_RenderDeviceDriver
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual int		GetDeviceCaps(int caps_id);
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	SaveState()
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SaveDC(m_hDC);
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	RestoreState(FX_BOOL bKeepSaved = FALSE)
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RestoreDC(m_hDC, -1);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bKeepSaved) {
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SaveDC(m_hDC);
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     const CFX_AffineMatrix* pObject2Device,
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     int fill_mode
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    );
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       const CFX_AffineMatrix* pObject2Device,
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       const CFX_GraphStateData* pGraphState
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      );
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_AffineMatrix* pObject2Device,
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_GraphStateData* pGraphState,
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD fill_color,
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD stroke_color,
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int fill_mode,
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int alpha_flag,
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             void* pIccTransform,
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int	blend_type
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            );
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL FillRect(const FX_RECT* pRect,
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD fill_color,
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int alpha_flag, void* pIccTransform, int blend_type);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     int alpha_flag, void* pIccTransform, int blend_type);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_LPVOID GetClipRgn() ;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL GetClipBox(FX_RECT* pRect);
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void*	GetPlatformSurface()
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (void*)m_hDC;
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  void* pIccTransform);
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      int dest_width, int dest_height, FX_DWORD flags,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      void* pIccTransform);
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       int alpha_flag, void* pIccTransform);
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HDC				m_hDC;
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int				m_Width, m_Height, m_nBitsPerPixel;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int				m_DeviceClass, m_RenderCaps;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CGdiDeviceDriver(HDC hDC, int device_class);
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CGdiDeviceDriver() {}
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CGdiDisplayDriver : public CGdiDeviceDriver
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CGdiDisplayDriver(HDC hDC);
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              int alpha_flag, void* pIccTransform);
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int alpha_flag, void* pIccTransform, int blend_type);
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                int alpha_flag, void* pIccTransform, int blend_type)
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                          int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                          int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CGdiPrinterDriver : public CGdiDeviceDriver
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CGdiPrinterDriver(HDC hDC);
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual int		GetDeviceCaps(int caps_id);
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              int alpha_flag, void* pIccTransform);
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int alpha_flag, void* pIccTransform, int blend_type);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                int alpha_flag, void* pIccTransform, int blend_type);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int				m_HorzSize, m_VertSize;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			m_bSupportROP;
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPSOutput : public IFX_PSOutput, public CFX_Object
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPSOutput(HDC hDC);
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual ~CPSOutput();
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void			Release()
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete this;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Init();
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	OutputPS(FX_LPCSTR string, int len);
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HDC				m_hDC;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPSTR        m_pBuf;
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPSPrinterDriver : public IFX_RenderDeviceDriver
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPSPrinterDriver();
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPSPrinterDriver();
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL IsPSPrintDriver()
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual int		GetDeviceCaps(int caps_id);
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	StartRendering();
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	EndRendering();
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	SaveState();
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void	RestoreState(FX_BOOL bKeepSaved = FALSE);
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     const CFX_AffineMatrix* pObject2Device,
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     int fill_mode
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    );
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       const CFX_AffineMatrix* pObject2Device,
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       const CFX_GraphStateData* pGraphState
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      );
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_AffineMatrix* pObject2Device,
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const CFX_GraphStateData* pGraphState,
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD fill_color,
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             FX_DWORD stroke_color,
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int fill_mode,
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int alpha_flag,
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             void* pIccTransform,
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             int blend_type
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            );
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL GetClipBox(FX_RECT* pRect);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              int alpha_flag, void* pIccTransform);
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  int alpha_flag, void* pIccTransform, int blend_type);
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                int alpha_flag, void* pIccTransform, int blend_type);
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                   int alpha_flag, void* pIccTransform);
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void*	GetPlatformSurface()
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (void*)m_hDC;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HDC				m_hDC;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL			m_bCmykOutput;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int				m_Width, m_Height, m_nBitsPerPixel;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int				m_HorzSize, m_VertSize;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPSOutput*		m_pPSOutput;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PSRenderer	m_PSRenderer;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);
239