// 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 "xfa/fde/fde_renderdevice.h"
#include "xfa/fgas/crt/fgas_memory.h"

class CFDE_FxgeDevice : public IFDE_RenderDevice, public CFX_Target {
 public:
  CFDE_FxgeDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
  ~CFDE_FxgeDevice();
  virtual void Release() { delete this; }

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

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

  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
                            const CFX_RectF* pSrcRect,
                            const CFX_RectF& dstRect,
                            const CFX_Matrix* pImgMatrix = NULL,
                            const CFX_Matrix* pDevMatrix = NULL);
  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
                             IFX_Font* pFont,
                             const FXTEXT_CHARPOS* pCharPos,
                             int32_t iCount,
                             FX_FLOAT fFontSize,
                             const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawBezier(IFDE_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 = NULL);
  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const CFX_PointsF& points,
                            FX_BOOL bClosed,
                            FX_FLOAT fTension = 0.5f,
                            const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_RectF& rect,
                              const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const CFX_PointsF& points,
                            const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
                           FX_FLOAT fPenWidth,
                           const CFX_PointF& pt1,
                           const CFX_PointF& pt2,
                           const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
                           FX_FLOAT fPenWidth,
                           const IFDE_Path* pPath,
                           const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_PointsF& points,
                              const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
                                FX_FLOAT fPenWidth,
                                const CFX_RectF& rect,
                                const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
                                  const CFX_PointsF& points,
                                  FX_FLOAT fTension = 0.5f,
                                  const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
                              const CFX_RectF& rect,
                              const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
                           const IFDE_Path* pPath,
                           const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
                              const CFX_PointsF& points,
                              const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
                                const CFX_RectF& rect,
                                const CFX_Matrix* pMatrix = NULL);
  FX_BOOL FillSolidPath(IFDE_Brush* pBrush,
                        const CFX_PathData* pPath,
                        const CFX_Matrix* pMatrix);
  FX_BOOL FillHatchPath(IFDE_Brush* pBrush,
                        const CFX_PathData* pPath,
                        const CFX_Matrix* pMatrix);
  FX_BOOL FillTexturePath(IFDE_Brush* pBrush,
                          const CFX_PathData* pPath,
                          const CFX_Matrix* pMatrix);
  FX_BOOL FillLinearGradientPath(IFDE_Brush* pBrush,
                                 const CFX_PathData* pPath,
                                 const CFX_Matrix* pMatrix);
  FX_BOOL DrawSolidString(IFDE_Brush* pBrush,
                          IFX_Font* pFont,
                          const FXTEXT_CHARPOS* pCharPos,
                          int32_t iCount,
                          FX_FLOAT fFontSize,
                          const CFX_Matrix* pMatrix);
  FX_BOOL DrawStringPath(IFDE_Brush* pBrush,
                         IFX_Font* pFont,
                         const FXTEXT_CHARPOS* pCharPos,
                         int32_t iCount,
                         FX_FLOAT fFontSize,
                         const CFX_Matrix* pMatrix);

 protected:
  FX_BOOL CreatePen(IFDE_Pen* pPen,
                    FX_FLOAT fPenWidth,
                    CFX_GraphStateData& graphState);
  FX_BOOL WrapTexture(int32_t iWrapMode,
                      const CFX_DIBitmap* pBitmap,
                      const CFX_PathData* pPath,
                      const CFX_Matrix* pMatrix);
  CFX_RenderDevice* m_pDevice;
  CFX_RectF m_rtClip;
  FX_BOOL m_bOwnerDevice;
  FXTEXT_CHARPOS* m_pCharPos;
  int32_t m_iCharCount;
};

#endif  // XFA_FDE_FDE_GEDEVICE_H_
