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_FXGE_AGG_FX_AGG_DRIVER_H_
8 #define CORE_FXGE_AGG_FX_AGG_DRIVER_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fxge/ifx_renderdevicedriver.h"
14 #include "third_party/agg23/agg_clip_liang_barsky.h"
15 #include "third_party/agg23/agg_path_storage.h"
16 #include "third_party/agg23/agg_rasterizer_scanline_aa.h"
17 
18 class CFX_ClipRgn;
19 class CFX_GraphStateData;
20 class CFX_Matrix;
21 class CFX_PathData;
22 
23 class CAgg_PathData {
24  public:
CAgg_PathData()25   CAgg_PathData() {}
~CAgg_PathData()26   ~CAgg_PathData() {}
27   void BuildPath(const CFX_PathData* pPathData,
28                  const CFX_Matrix* pObject2Device);
29 
30   agg::path_storage m_PathData;
31 };
32 
33 class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver {
34  public:
35   CFX_AggDeviceDriver(const RetainPtr<CFX_DIBitmap>& pBitmap,
36                       bool bRgbByteOrder,
37                       const RetainPtr<CFX_DIBitmap>& pOriDevice,
38                       bool bGroupKnockout);
39   ~CFX_AggDeviceDriver() override;
40 
41   void InitPlatform();
42   void DestroyPlatform();
43 
44   // IFX_RenderDeviceDriver
45   int GetDeviceCaps(int caps_id) const override;
46   void SaveState() override;
47   void RestoreState(bool bKeepSaved) override;
48   bool SetClip_PathFill(const CFX_PathData* pPathData,
49                         const CFX_Matrix* pObject2Device,
50                         int fill_mode) override;
51   bool SetClip_PathStroke(const CFX_PathData* pPathData,
52                           const CFX_Matrix* pObject2Device,
53                           const CFX_GraphStateData* pGraphState) override;
54   bool DrawPath(const CFX_PathData* pPathData,
55                 const CFX_Matrix* pObject2Device,
56                 const CFX_GraphStateData* pGraphState,
57                 uint32_t fill_color,
58                 uint32_t stroke_color,
59                 int fill_mode,
60                 int blend_type) override;
61   bool SetPixel(int x, int y, uint32_t color) override;
62   bool FillRectWithBlend(const FX_RECT* pRect,
63                          uint32_t fill_color,
64                          int blend_type) override;
65   bool GetClipBox(FX_RECT* pRect) override;
66   bool GetDIBits(const RetainPtr<CFX_DIBitmap>& pBitmap,
67                  int left,
68                  int top) override;
69   RetainPtr<CFX_DIBitmap> GetBackDrop() override;
70   bool SetDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
71                  uint32_t color,
72                  const FX_RECT* pSrcRect,
73                  int left,
74                  int top,
75                  int blend_type) override;
76   bool StretchDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
77                      uint32_t color,
78                      int dest_left,
79                      int dest_top,
80                      int dest_width,
81                      int dest_height,
82                      const FX_RECT* pClipRect,
83                      uint32_t flags,
84                      int blend_type) override;
85   bool StartDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
86                    int bitmap_alpha,
87                    uint32_t color,
88                    const CFX_Matrix* pMatrix,
89                    uint32_t flags,
90                    std::unique_ptr<CFX_ImageRenderer>* handle,
91                    int blend_type) override;
92   bool ContinueDIBits(CFX_ImageRenderer* handle,
93                       IFX_PauseIndicator* pPause) override;
94   bool DrawDeviceText(int nChars,
95                       const FXTEXT_CHARPOS* pCharPos,
96                       CFX_Font* pFont,
97                       const CFX_Matrix* pObject2Device,
98                       float font_size,
99                       uint32_t color) override;
100   int GetDriverType() const override;
101 
102   bool RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer,
103                         uint32_t color,
104                         bool bFullCover,
105                         bool bGroupKnockout);
106 
107   void SetClipMask(agg::rasterizer_scanline_aa& rasterizer);
108 
109   virtual uint8_t* GetBuffer() const;
110 
111  private:
112   RetainPtr<CFX_DIBitmap> m_pBitmap;
113   std::unique_ptr<CFX_ClipRgn> m_pClipRgn;
114   std::vector<std::unique_ptr<CFX_ClipRgn>> m_StateStack;
115 #if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
116   void* m_pPlatformGraphics;
117 #endif
118   int m_FillFlags;
119   bool m_bRgbByteOrder;
120   RetainPtr<CFX_DIBitmap> m_pOriDevice;
121   bool m_bGroupKnockout;
122 };
123 
124 #endif  // CORE_FXGE_AGG_FX_AGG_DRIVER_H_
125