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_SRC_FXGE_AGG_INCLUDE_FX_AGG_DRIVER_H_
8 #define CORE_SRC_FXGE_AGG_INCLUDE_FX_AGG_DRIVER_H_
9 
10 #include "core/include/fxge/fx_ge.h"
11 #include "third_party/agg23/agg_clip_liang_barsky.h"
12 #include "third_party/agg23/agg_path_storage.h"
13 #include "third_party/agg23/agg_rasterizer_scanline_aa.h"
14 
15 class CFX_Matrix;
16 class CFX_PathData;
17 
18 class CAgg_PathData {
19  public:
CAgg_PathData()20   CAgg_PathData() {}
~CAgg_PathData()21   ~CAgg_PathData() {}
22   void BuildPath(const CFX_PathData* pPathData,
23                  const CFX_Matrix* pObject2Device);
24 
25   agg::path_storage m_PathData;
26 };
27 class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver {
28  public:
29   CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap,
30                       int dither_bits,
31                       FX_BOOL bRgbByteOrder,
32                       CFX_DIBitmap* pOriDevice,
33                       FX_BOOL bGroupKnockout);
34   ~CFX_AggDeviceDriver() override;
35 
36   void InitPlatform();
37   void DestroyPlatform();
38 
39   // IFX_RenderDeviceDriver
40   int GetDeviceCaps(int caps_id) override;
41   void SaveState() override;
42   void RestoreState(FX_BOOL bKeepSaved) override;
43   FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
44                            const CFX_Matrix* pObject2Device,
45                            int fill_mode) override;
46   FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
47                              const CFX_Matrix* pObject2Device,
48                              const CFX_GraphStateData* pGraphState) override;
49   FX_BOOL DrawPath(const CFX_PathData* pPathData,
50                    const CFX_Matrix* pObject2Device,
51                    const CFX_GraphStateData* pGraphState,
52                    FX_DWORD fill_color,
53                    FX_DWORD stroke_color,
54                    int fill_mode,
55                    int alpha_flag,
56                    void* pIccTransform,
57                    int blend_type) override;
58   FX_BOOL SetPixel(int x,
59                    int y,
60                    FX_DWORD color,
61                    int alpha_flag,
62                    void* pIccTransform) override;
63   FX_BOOL FillRect(const FX_RECT* pRect,
64                    FX_DWORD fill_color,
65                    int alpha_flag,
66                    void* pIccTransform,
67                    int blend_type) override;
DrawCosmeticLine(FX_FLOAT x1,FX_FLOAT y1,FX_FLOAT x2,FX_FLOAT y2,FX_DWORD color,int alpha_flag,void * pIccTransform,int blend_type)68   FX_BOOL DrawCosmeticLine(FX_FLOAT x1,
69                            FX_FLOAT y1,
70                            FX_FLOAT x2,
71                            FX_FLOAT y2,
72                            FX_DWORD color,
73                            int alpha_flag,
74                            void* pIccTransform,
75                            int blend_type) override {
76     return FALSE;
77   }
78   FX_BOOL GetClipBox(FX_RECT* pRect) override;
79   FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap,
80                     int left,
81                     int top,
82                     void* pIccTransform = NULL,
83                     FX_BOOL bDEdge = FALSE) override;
GetBackDrop()84   CFX_DIBitmap* GetBackDrop() override { return m_pOriDevice; }
85   FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
86                     FX_DWORD color,
87                     const FX_RECT* pSrcRect,
88                     int left,
89                     int top,
90                     int blend_type,
91                     int alpha_flag,
92                     void* pIccTransform) override;
93   FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap,
94                         FX_DWORD color,
95                         int dest_left,
96                         int dest_top,
97                         int dest_width,
98                         int dest_height,
99                         const FX_RECT* pClipRect,
100                         FX_DWORD flags,
101                         int alpha_flag,
102                         void* pIccTransform,
103                         int blend_type) override;
104   FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap,
105                       int bitmap_alpha,
106                       FX_DWORD color,
107                       const CFX_Matrix* pMatrix,
108                       FX_DWORD flags,
109                       void*& handle,
110                       int alpha_flag,
111                       void* pIccTransform,
112                       int blend_type) override;
113   FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause) override;
114   void CancelDIBits(void* handle) override;
115   FX_BOOL DrawDeviceText(int nChars,
116                          const FXTEXT_CHARPOS* pCharPos,
117                          CFX_Font* pFont,
118                          CFX_FontCache* pCache,
119                          const CFX_Matrix* pObject2Device,
120                          FX_FLOAT font_size,
121                          FX_DWORD color,
122                          int alpha_flag,
123                          void* pIccTransform) override;
GetDriverType()124   int GetDriverType() override { return 1; }
125 
126   FX_BOOL RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer,
127                            FX_DWORD color,
128                            FX_BOOL bFullCover,
129                            FX_BOOL bGroupKnockout,
130                            int alpha_flag,
131                            void* pIccTransform);
132 
133   void SetClipMask(agg::rasterizer_scanline_aa& rasterizer);
134 
GetBuffer()135   virtual uint8_t* GetBuffer() const { return m_pBitmap->GetBuffer(); }
136 
137   CFX_DIBitmap* m_pBitmap;
138   CFX_ClipRgn* m_pClipRgn;
139   CFX_ArrayTemplate<CFX_ClipRgn*> m_StateStack;
140   void* m_pPlatformGraphics;
141   void* m_pPlatformBitmap;
142   void* m_pDwRenderTartget;
143   int m_FillFlags;
144   int m_DitherBits;
145   FX_BOOL m_bRgbByteOrder;
146   CFX_DIBitmap* m_pOriDevice;
147   FX_BOOL m_bGroupKnockout;
148 };
149 
150 #endif  // CORE_SRC_FXGE_AGG_INCLUDE_FX_AGG_DRIVER_H_
151