1// Copyright 2016 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_CFX_RENDERDEVICE_H_
8#define CORE_FXGE_CFX_RENDERDEVICE_H_
9
10#include <memory>
11
12#include "core/fxcrt/unowned_ptr.h"
13#include "core/fxge/cfx_color.h"
14#include "core/fxge/fx_dib.h"
15
16class CFX_DIBitmap;
17class CFX_Font;
18class CFX_GraphStateData;
19class CFX_ImageRenderer;
20class IFX_PauseIndicator;
21class IFX_RenderDeviceDriver;
22
23#define FXDC_DEVICE_CLASS 1
24#define FXDC_PIXEL_WIDTH 2
25#define FXDC_PIXEL_HEIGHT 3
26#define FXDC_BITS_PIXEL 4
27#define FXDC_HORZ_SIZE 5
28#define FXDC_VERT_SIZE 6
29#define FXDC_RENDER_CAPS 7
30#define FXDC_DISPLAY 1
31#define FXDC_PRINTER 2
32
33#define FXRC_GET_BITS 0x01
34#define FXRC_BIT_MASK 0x02
35#define FXRC_ALPHA_PATH 0x10
36#define FXRC_ALPHA_IMAGE 0x20
37#define FXRC_ALPHA_OUTPUT 0x40
38#define FXRC_BLEND_MODE 0x80
39#define FXRC_SOFT_CLIP 0x100
40#define FXRC_CMYK_OUTPUT 0x200
41#define FXRC_BITMASK_OUTPUT 0x400
42#define FXRC_BYTEMASK_OUTPUT 0x800
43#define FXRENDER_IMAGE_LOSSY 0x1000
44#define FXRC_FILLSTROKE_PATH 0x2000
45#define FXRC_SHADING 0x4000
46
47#define FXFILL_ALTERNATE 1
48#define FXFILL_WINDING 2
49#define FXFILL_FULLCOVER 4
50#define FXFILL_RECT_AA 8
51#define FX_FILL_STROKE 16
52#define FX_STROKE_ADJUST 32
53#define FX_STROKE_TEXT_MODE 64
54#define FX_FILL_TEXT_MODE 128
55#define FX_ZEROAREA_FILL 256
56#define FXFILL_NOPATHSMOOTH 512
57
58#define FXTEXT_CLEARTYPE 0x01
59#define FXTEXT_BGR_STRIPE 0x02
60#define FXTEXT_PRINTGRAPHICTEXT 0x04
61#define FXTEXT_NO_NATIVETEXT 0x08
62#define FXTEXT_PRINTIMAGETEXT 0x10
63#define FXTEXT_NOSMOOTH 0x20
64
65class CFX_PathData;
66
67enum class FXPT_TYPE : uint8_t { LineTo, BezierTo, MoveTo };
68
69class FXTEXT_CHARPOS {
70 public:
71  FXTEXT_CHARPOS();
72  FXTEXT_CHARPOS(const FXTEXT_CHARPOS&);
73  ~FXTEXT_CHARPOS();
74
75  float m_AdjustMatrix[4];
76  CFX_PointF m_Origin;
77  uint32_t m_Unicode;
78  uint32_t m_GlyphIndex;
79  int32_t m_FontCharWidth;
80#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
81  uint32_t m_ExtGID;
82#endif
83  int32_t m_FallbackFontPosition;
84  bool m_bGlyphAdjust;
85  bool m_bFontStyle;
86};
87
88class CFX_RenderDevice {
89 public:
90  class StateRestorer {
91   public:
92    explicit StateRestorer(CFX_RenderDevice* pDevice);
93    ~StateRestorer();
94
95   private:
96    UnownedPtr<CFX_RenderDevice> m_pDevice;
97  };
98
99  CFX_RenderDevice();
100  virtual ~CFX_RenderDevice();
101
102  // Take ownership of |pDriver|.
103  void SetDeviceDriver(std::unique_ptr<IFX_RenderDeviceDriver> pDriver);
104  IFX_RenderDeviceDriver* GetDeviceDriver() const {
105    return m_pDeviceDriver.get();
106  }
107
108  void SaveState();
109  void RestoreState(bool bKeepSaved);
110
111  int GetWidth() const { return m_Width; }
112  int GetHeight() const { return m_Height; }
113  int GetDeviceClass() const { return m_DeviceClass; }
114  int GetRenderCaps() const { return m_RenderCaps; }
115  int GetDeviceCaps(int id) const;
116  CFX_Matrix GetCTM() const;
117  RetainPtr<CFX_DIBitmap> GetBitmap() const;
118  void SetBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap);
119  bool CreateCompatibleBitmap(const RetainPtr<CFX_DIBitmap>& pDIB,
120                              int width,
121                              int height) const;
122  const FX_RECT& GetClipBox() const { return m_ClipBox; }
123  bool SetClip_PathFill(const CFX_PathData* pPathData,
124                        const CFX_Matrix* pObject2Device,
125                        int fill_mode);
126  bool SetClip_Rect(const CFX_RectF& pRect);
127  bool SetClip_Rect(const FX_RECT& pRect);
128  bool SetClip_PathStroke(const CFX_PathData* pPathData,
129                          const CFX_Matrix* pObject2Device,
130                          const CFX_GraphStateData* pGraphState);
131  bool DrawPath(const CFX_PathData* pPathData,
132                const CFX_Matrix* pObject2Device,
133                const CFX_GraphStateData* pGraphState,
134                uint32_t fill_color,
135                uint32_t stroke_color,
136                int fill_mode) {
137    return DrawPathWithBlend(pPathData, pObject2Device, pGraphState, fill_color,
138                             stroke_color, fill_mode, FXDIB_BLEND_NORMAL);
139  }
140  bool DrawPathWithBlend(const CFX_PathData* pPathData,
141                         const CFX_Matrix* pObject2Device,
142                         const CFX_GraphStateData* pGraphState,
143                         uint32_t fill_color,
144                         uint32_t stroke_color,
145                         int fill_mode,
146                         int blend_type);
147  bool FillRect(const FX_RECT* pRect, uint32_t color) {
148    return FillRectWithBlend(pRect, color, FXDIB_BLEND_NORMAL);
149  }
150
151  RetainPtr<CFX_DIBitmap> GetBackDrop();
152  bool GetDIBits(const RetainPtr<CFX_DIBitmap>& pBitmap, int left, int top);
153  bool SetDIBits(const RetainPtr<CFX_DIBSource>& pBitmap, int left, int top) {
154    return SetDIBitsWithBlend(pBitmap, left, top, FXDIB_BLEND_NORMAL);
155  }
156  bool SetDIBitsWithBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
157                          int left,
158                          int top,
159                          int blend_type);
160  bool StretchDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
161                     int left,
162                     int top,
163                     int dest_width,
164                     int dest_height) {
165    return StretchDIBitsWithFlagsAndBlend(pBitmap, left, top, dest_width,
166                                          dest_height, 0, FXDIB_BLEND_NORMAL);
167  }
168  bool StretchDIBitsWithFlagsAndBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
169                                      int left,
170                                      int top,
171                                      int dest_width,
172                                      int dest_height,
173                                      uint32_t flags,
174                                      int blend_type);
175  bool SetBitMask(const RetainPtr<CFX_DIBSource>& pBitmap,
176                  int left,
177                  int top,
178                  uint32_t color);
179  bool StretchBitMask(const RetainPtr<CFX_DIBSource>& pBitmap,
180                      int left,
181                      int top,
182                      int dest_width,
183                      int dest_height,
184                      uint32_t color);
185  bool StretchBitMaskWithFlags(const RetainPtr<CFX_DIBSource>& pBitmap,
186                               int left,
187                               int top,
188                               int dest_width,
189                               int dest_height,
190                               uint32_t color,
191                               uint32_t flags);
192  bool StartDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
193                   int bitmap_alpha,
194                   uint32_t color,
195                   const CFX_Matrix* pMatrix,
196                   uint32_t flags,
197                   std::unique_ptr<CFX_ImageRenderer>* handle) {
198    return StartDIBitsWithBlend(pBitmap, bitmap_alpha, color, pMatrix, flags,
199                                handle, FXDIB_BLEND_NORMAL);
200  }
201  bool StartDIBitsWithBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
202                            int bitmap_alpha,
203                            uint32_t color,
204                            const CFX_Matrix* pMatrix,
205                            uint32_t flags,
206                            std::unique_ptr<CFX_ImageRenderer>* handle,
207                            int blend_type);
208  bool ContinueDIBits(CFX_ImageRenderer* handle, IFX_PauseIndicator* pPause);
209
210  bool DrawNormalText(int nChars,
211                      const FXTEXT_CHARPOS* pCharPos,
212                      CFX_Font* pFont,
213                      float font_size,
214                      const CFX_Matrix* pText2Device,
215                      uint32_t fill_color,
216                      uint32_t text_flags);
217  bool DrawTextPath(int nChars,
218                    const FXTEXT_CHARPOS* pCharPos,
219                    CFX_Font* pFont,
220                    float font_size,
221                    const CFX_Matrix* pText2User,
222                    const CFX_Matrix* pUser2Device,
223                    const CFX_GraphStateData* pGraphState,
224                    uint32_t fill_color,
225                    uint32_t stroke_color,
226                    CFX_PathData* pClippingPath,
227                    int nFlag);
228
229  void DrawFillRect(const CFX_Matrix* pUser2Device,
230                    const CFX_FloatRect& rect,
231                    const CFX_Color& color,
232                    int32_t nTransparency);
233  void DrawFillRect(const CFX_Matrix* pUser2Device,
234                    const CFX_FloatRect& rect,
235                    const FX_COLORREF& color);
236  void DrawStrokeRect(const CFX_Matrix* pUser2Device,
237                      const CFX_FloatRect& rect,
238                      const FX_COLORREF& color,
239                      float fWidth);
240  void DrawStrokeLine(const CFX_Matrix* pUser2Device,
241                      const CFX_PointF& ptMoveTo,
242                      const CFX_PointF& ptLineTo,
243                      const FX_COLORREF& color,
244                      float fWidth);
245  void DrawBorder(const CFX_Matrix* pUser2Device,
246                  const CFX_FloatRect& rect,
247                  float fWidth,
248                  const CFX_Color& color,
249                  const CFX_Color& crLeftTop,
250                  const CFX_Color& crRightBottom,
251                  BorderStyle nStyle,
252                  int32_t nTransparency);
253  void DrawFillArea(const CFX_Matrix* pUser2Device,
254                    const CFX_PointF* pPts,
255                    int32_t nCount,
256                    const FX_COLORREF& color);
257  void DrawShadow(const CFX_Matrix* pUser2Device,
258                  bool bVertical,
259                  bool bHorizontal,
260                  CFX_FloatRect rect,
261                  int32_t nTransparency,
262                  int32_t nStartGray,
263                  int32_t nEndGray);
264
265#ifdef _SKIA_SUPPORT_
266  virtual void DebugVerifyBitmapIsPreMultiplied() const;
267  virtual bool SetBitsWithMask(const RetainPtr<CFX_DIBSource>& pBitmap,
268                               const RetainPtr<CFX_DIBSource>& pMask,
269                               int left,
270                               int top,
271                               int bitmap_alpha,
272                               int blend_type);
273#endif
274#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
275  void Flush(bool release);
276#endif
277
278 private:
279  void InitDeviceInfo();
280  void UpdateClipBox();
281  bool DrawFillStrokePath(const CFX_PathData* pPathData,
282                          const CFX_Matrix* pObject2Device,
283                          const CFX_GraphStateData* pGraphState,
284                          uint32_t fill_color,
285                          uint32_t stroke_color,
286                          int fill_mode,
287                          int blend_type);
288  bool DrawCosmeticLine(const CFX_PointF& ptMoveTo,
289                        const CFX_PointF& ptLineTo,
290                        uint32_t color,
291                        int fill_mode,
292                        int blend_type);
293  bool FillRectWithBlend(const FX_RECT* pRect, uint32_t color, int blend_type);
294
295  RetainPtr<CFX_DIBitmap> m_pBitmap;
296  int m_Width;
297  int m_Height;
298  int m_bpp;
299  int m_RenderCaps;
300  int m_DeviceClass;
301  FX_RECT m_ClipBox;
302  std::unique_ptr<IFX_RenderDeviceDriver> m_pDeviceDriver;
303};
304
305#endif  // CORE_FXGE_CFX_RENDERDEVICE_H_
306