// 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 "core/fxge/include/cfx_renderdevice.h"
#include "xfa/fgas/crt/fgas_memory.h"

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

class CFDE_RenderDevice : public CFX_Target {
 public:
  CFDE_RenderDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
  ~CFDE_RenderDevice() override;

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

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

  FX_BOOL DrawImage(CFX_DIBSource* pDib,
                    const CFX_RectF* pSrcRect,
                    const CFX_RectF& dstRect,
                    const CFX_Matrix* pImgMatrix = nullptr,
                    const CFX_Matrix* pDevMatrix = nullptr);
  FX_BOOL DrawString(CFDE_Brush* pBrush,
                     CFGAS_GEFont* pFont,
                     const FXTEXT_CHARPOS* pCharPos,
                     int32_t iCount,
                     FX_FLOAT fFontSize,
                     const CFX_Matrix* pMatrix = nullptr);
  FX_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);
  FX_BOOL DrawCurve(CFDE_Pen* pPen,
                    FX_FLOAT fPenWidth,
                    const CFX_PointsF& points,
                    FX_BOOL bClosed,
                    FX_FLOAT fTension = 0.5f,
                    const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawEllipse(CFDE_Pen* pPen,
                      FX_FLOAT fPenWidth,
                      const CFX_RectF& rect,
                      const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawLines(CFDE_Pen* pPen,
                    FX_FLOAT fPenWidth,
                    const CFX_PointsF& points,
                    const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawLine(CFDE_Pen* pPen,
                   FX_FLOAT fPenWidth,
                   const CFX_PointF& pt1,
                   const CFX_PointF& pt2,
                   const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawPath(CFDE_Pen* pPen,
                   FX_FLOAT fPenWidth,
                   const CFDE_Path* pPath,
                   const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawPolygon(CFDE_Pen* pPen,
                      FX_FLOAT fPenWidth,
                      const CFX_PointsF& points,
                      const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL DrawRectangle(CFDE_Pen* pPen,
                        FX_FLOAT fPenWidth,
                        const CFX_RectF& rect,
                        const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL FillClosedCurve(CFDE_Brush* pBrush,
                          const CFX_PointsF& points,
                          FX_FLOAT fTension = 0.5f,
                          const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL FillEllipse(CFDE_Brush* pBrush,
                      const CFX_RectF& rect,
                      const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL FillPath(CFDE_Brush* pBrush,
                   const CFDE_Path* pPath,
                   const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL FillPolygon(CFDE_Brush* pBrush,
                      const CFX_PointsF& points,
                      const CFX_Matrix* pMatrix = nullptr);
  FX_BOOL FillRectangle(CFDE_Brush* pBrush,
                        const CFX_RectF& rect,
                        const CFX_Matrix* pMatrix = nullptr);

  FX_BOOL DrawSolidString(CFDE_Brush* pBrush,
                          CFGAS_GEFont* pFont,
                          const FXTEXT_CHARPOS* pCharPos,
                          int32_t iCount,
                          FX_FLOAT fFontSize,
                          const CFX_Matrix* pMatrix);
  FX_BOOL DrawStringPath(CFDE_Brush* pBrush,
                         CFGAS_GEFont* pFont,
                         const FXTEXT_CHARPOS* pCharPos,
                         int32_t iCount,
                         FX_FLOAT fFontSize,
                         const CFX_Matrix* pMatrix);

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

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

#endif  // XFA_FDE_FDE_GEDEVICE_H_
