// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FDE_FDE_GEDEVICE_H_
#define XFA_FDE_FDE_GEDEVICE_H_

#include <vector>

#include "core/fxge/cfx_renderdevice.h"
#include "xfa/fgas/font/cfgas_gefont.h"

class CFDE_Brush;
class CFDE_Path;
class CFDE_Pen;
class CFX_GraphStateData;

class CFDE_RenderDevice {
 public:
  CFDE_RenderDevice(CFX_RenderDevice* pDevice, bool bOwnerDevice);
  ~CFDE_RenderDevice();

  int32_t GetWidth() const;
  int32_t GetHeight() const;
  void SaveState();
  void RestoreState();
  bool SetClipPath(const CFDE_Path* pClip);
  CFDE_Path* GetClipPath() const;
  bool SetClipRect(const CFX_RectF& rtClip);
  const CFX_RectF& GetClipRect();

  FX_FLOAT GetDpiX() const;
  FX_FLOAT GetDpiY() const;

  bool DrawImage(CFX_DIBSource* pDib,
                 const CFX_RectF* pSrcRect,
                 const CFX_RectF& dstRect,
                 const CFX_Matrix* pImgMatrix = nullptr,
                 const CFX_Matrix* pDevMatrix = nullptr);
  bool DrawString(CFDE_Brush* pBrush,
                  const CFX_RetainPtr<CFGAS_GEFont>& pFont,
                  const FXTEXT_CHARPOS* pCharPos,
                  int32_t iCount,
                  FX_FLOAT fFontSize,
                  const CFX_Matrix* pMatrix = nullptr);
  bool DrawBezier(CFDE_Pen* pPen,
                  FX_FLOAT fPenWidth,
                  const CFX_PointF& pt1,
                  const CFX_PointF& pt2,
                  const CFX_PointF& pt3,
                  const CFX_PointF& pt4,
                  const CFX_Matrix* pMatrix = nullptr);
  bool DrawCurve(CFDE_Pen* pPen,
                 FX_FLOAT fPenWidth,
                 const std::vector<CFX_PointF>& points,
                 bool bClosed,
                 FX_FLOAT fTension = 0.5f,
                 const CFX_Matrix* pMatrix = nullptr);
  bool DrawEllipse(CFDE_Pen* pPen,
                   FX_FLOAT fPenWidth,
                   const CFX_RectF& rect,
                   const CFX_Matrix* pMatrix = nullptr);
  bool DrawLines(CFDE_Pen* pPen,
                 FX_FLOAT fPenWidth,
                 const std::vector<CFX_PointF>& points,
                 const CFX_Matrix* pMatrix = nullptr);
  bool DrawLine(CFDE_Pen* pPen,
                FX_FLOAT fPenWidth,
                const CFX_PointF& pt1,
                const CFX_PointF& pt2,
                const CFX_Matrix* pMatrix = nullptr);
  bool DrawPath(CFDE_Pen* pPen,
                FX_FLOAT fPenWidth,
                const CFDE_Path* pPath,
                const CFX_Matrix* pMatrix = nullptr);
  bool DrawPolygon(CFDE_Pen* pPen,
                   FX_FLOAT fPenWidth,
                   const std::vector<CFX_PointF>& points,
                   const CFX_Matrix* pMatrix = nullptr);
  bool DrawRectangle(CFDE_Pen* pPen,
                     FX_FLOAT fPenWidth,
                     const CFX_RectF& rect,
                     const CFX_Matrix* pMatrix = nullptr);
  bool FillClosedCurve(CFDE_Brush* pBrush,
                       const std::vector<CFX_PointF>& points,
                       FX_FLOAT fTension = 0.5f,
                       const CFX_Matrix* pMatrix = nullptr);
  bool FillEllipse(CFDE_Brush* pBrush,
                   const CFX_RectF& rect,
                   const CFX_Matrix* pMatrix = nullptr);
  bool FillPath(CFDE_Brush* pBrush,
                const CFDE_Path* pPath,
                const CFX_Matrix* pMatrix = nullptr);
  bool FillPolygon(CFDE_Brush* pBrush,
                   const std::vector<CFX_PointF>& points,
                   const CFX_Matrix* pMatrix = nullptr);
  bool FillRectangle(CFDE_Brush* pBrush,
                     const CFX_RectF& rect,
                     const CFX_Matrix* pMatrix = nullptr);

  bool DrawSolidString(CFDE_Brush* pBrush,
                       const CFX_RetainPtr<CFGAS_GEFont>& pFont,
                       const FXTEXT_CHARPOS* pCharPos,
                       int32_t iCount,
                       FX_FLOAT fFontSize,
                       const CFX_Matrix* pMatrix);
  bool DrawStringPath(CFDE_Brush* pBrush,
                      const CFX_RetainPtr<CFGAS_GEFont>& pFont,
                      const FXTEXT_CHARPOS* pCharPos,
                      int32_t iCount,
                      FX_FLOAT fFontSize,
                      const CFX_Matrix* pMatrix);

 protected:
  bool CreatePen(CFDE_Pen* pPen,
                 FX_FLOAT fPenWidth,
                 CFX_GraphStateData& graphState);

  CFX_RenderDevice* const m_pDevice;
  CFX_RectF m_rtClip;
  bool m_bOwnerDevice;
  int32_t m_iCharCount;
};

#endif  // XFA_FDE_FDE_GEDEVICE_H_
