// 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_RENDERDEVICE_H_
#define XFA_FDE_FDE_RENDERDEVICE_H_

#include "core/include/fxcrt/fx_coordinates.h"
#include "core/include/fxge/fx_font.h"
#include "core/include/fxge/fx_ge.h"
#include "xfa/fde/fde_path.h"
#include "xfa/fgas/font/fgas_font.h"

class IFDE_Pen;
class IFDE_Brush;
class CFX_DIBitmap;
class CFX_DIBSource;

typedef struct FDE_HDEVICESTATE_ { void* pData; } * FDE_HDEVICESTATE;

class IFDE_RenderDevice {
 public:
  static IFDE_RenderDevice* Create(CFX_DIBitmap* pBitmap,
                                   FX_BOOL bRgbByteOrder = FALSE);
  static IFDE_RenderDevice* Create(CFX_RenderDevice* pDevice);
  virtual ~IFDE_RenderDevice() {}
  virtual void Release() = 0;

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

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

  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) = 0;
  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) = 0;
  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) = 0;
  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) = 0;
  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_RectF& rect,
                              const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
                            FX_FLOAT fPenWidth,
                            const CFX_PointsF& points,
                            const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
                           FX_FLOAT fPenWidth,
                           const CFX_PointF& pt1,
                           const CFX_PointF& pt2,
                           const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
                           FX_FLOAT fPenWidth,
                           const IFDE_Path* pPath,
                           const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
                              FX_FLOAT fPenWidth,
                              const CFX_PointsF& points,
                              const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
                                FX_FLOAT fPenWidth,
                                const CFX_RectF& rect,
                                const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
                                  const CFX_PointsF& points,
                                  FX_FLOAT fTension = 0.5f,
                                  const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
                              const CFX_RectF& rect,
                              const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
                           const IFDE_Path* pPath,
                           const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
                              const CFX_PointsF& points,
                              const CFX_Matrix* pMatrix = NULL) = 0;
  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
                                const CFX_RectF& rect,
                                const CFX_Matrix* pMatrix = NULL) = 0;
};

#endif  // XFA_FDE_FDE_RENDERDEVICE_H_
