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