14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXGE_AGG_FX_AGG_DRIVER_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXGE_AGG_FX_AGG_DRIVER_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ifx_renderdevicedriver.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/agg23/agg_clip_liang_barsky.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/agg23/agg_path_storage.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/agg23/agg_rasterizer_scanline_aa.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_ClipRgn;
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_GraphStateData;
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_Matrix;
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_PathData;
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CAgg_PathData {
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CAgg_PathData() {}
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CAgg_PathData() {}
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void BuildPath(const CFX_PathData* pPathData,
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 const CFX_Matrix* pObject2Device);
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  agg::path_storage m_PathData;
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_AggDeviceDriver : public IFX_RenderDeviceDriver {
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_AggDeviceDriver(const RetainPtr<CFX_DIBitmap>& pBitmap,
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      bool bRgbByteOrder,
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      const RetainPtr<CFX_DIBitmap>& pOriDevice,
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      bool bGroupKnockout);
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CFX_AggDeviceDriver() override;
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InitPlatform();
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void DestroyPlatform();
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // IFX_RenderDeviceDriver
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetDeviceCaps(int caps_id) const override;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SaveState() override;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void RestoreState(bool bKeepSaved) override;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetClip_PathFill(const CFX_PathData* pPathData,
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        const CFX_Matrix* pObject2Device,
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        int fill_mode) override;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetClip_PathStroke(const CFX_PathData* pPathData,
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          const CFX_Matrix* pObject2Device,
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          const CFX_GraphStateData* pGraphState) override;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool DrawPath(const CFX_PathData* pPathData,
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                const CFX_Matrix* pObject2Device,
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                const CFX_GraphStateData* pGraphState,
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                uint32_t fill_color,
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                uint32_t stroke_color,
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                int fill_mode,
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                int blend_type) override;
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool SetPixel(int x, int y, uint32_t color) override;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool FillRectWithBlend(const FX_RECT* pRect,
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         uint32_t fill_color,
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         int blend_type) override;
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool GetClipBox(FX_RECT* pRect) override;
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool GetDIBits(const RetainPtr<CFX_DIBitmap>& pBitmap,
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 int left,
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 int top) override;
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RetainPtr<CFX_DIBitmap> GetBackDrop() override;
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool SetDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 uint32_t color,
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 const FX_RECT* pSrcRect,
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 int left,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 int top,
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 int blend_type) override;
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool StretchDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     uint32_t color,
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     int dest_left,
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     int dest_top,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     int dest_width,
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     int dest_height,
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     const FX_RECT* pClipRect,
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     uint32_t flags,
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     int blend_type) override;
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool StartDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   int bitmap_alpha,
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   uint32_t color,
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   const CFX_Matrix* pMatrix,
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   uint32_t flags,
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   std::unique_ptr<CFX_ImageRenderer>* handle,
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   int blend_type) override;
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool ContinueDIBits(CFX_ImageRenderer* handle,
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      IFX_PauseIndicator* pPause) override;
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool DrawDeviceText(int nChars,
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      const FXTEXT_CHARPOS* pCharPos,
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      CFX_Font* pFont,
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      const CFX_Matrix* pObject2Device,
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      float font_size,
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      uint32_t color) override;
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetDriverType() const override;
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        uint32_t color,
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        bool bFullCover,
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        bool bGroupKnockout);
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetClipMask(agg::rasterizer_scanline_aa& rasterizer);
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  virtual uint8_t* GetBuffer() const;
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RetainPtr<CFX_DIBitmap> m_pBitmap;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFX_ClipRgn> m_pClipRgn;
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<CFX_ClipRgn>> m_StateStack;
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void* m_pPlatformGraphics;
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int m_FillFlags;
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool m_bRgbByteOrder;
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RetainPtr<CFX_DIBitmap> m_pOriDevice;
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool m_bGroupKnockout;
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FXGE_AGG_FX_AGG_DRIVER_H_
125