// 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_GEOBJECT_H_
#define XFA_FDE_FDE_GEOBJECT_H_

#include "core/fxge/include/fx_ge.h"
#include "xfa/fde/fde_path.h"
#include "xfa/fgas/crt/fgas_memory.h"

class CFDE_Path : public IFDE_Path, public CFX_Target {
 public:
  virtual void Release() { delete this; }

  virtual FX_BOOL StartFigure();
  virtual FX_BOOL CloseFigure();

  virtual void AddBezier(const CFX_PointsF& points);
  virtual void AddBeziers(const CFX_PointsF& points);
  virtual void AddCurve(const CFX_PointsF& points,
                        FX_BOOL bClosed,
                        FX_FLOAT fTension = 0.5f);
  virtual void AddEllipse(const CFX_RectF& rect);
  virtual void AddLines(const CFX_PointsF& points);
  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect);
  virtual void AddPolygon(const CFX_PointsF& points);
  virtual void AddRectangle(const CFX_RectF& rect);
  virtual void GetBBox(CFX_RectF& bbox) const;
  virtual void GetBBox(CFX_RectF& bbox,
                       FX_FLOAT fLineWidth,
                       FX_FLOAT fMiterLimit) const;
  FX_PATHPOINT* AddPoints(int32_t iCount);
  FX_PATHPOINT* GetLastPoint(int32_t iCount = 1) const;
  FX_BOOL FigureClosed() const;
  void MoveTo(FX_FLOAT fx, FX_FLOAT fy);
  void LineTo(FX_FLOAT fx, FX_FLOAT fy);
  void BezierTo(const CFX_PointF& p1,
                const CFX_PointF& p2,
                const CFX_PointF& p3);
  void ArcTo(FX_BOOL bStart,
             const CFX_RectF& rect,
             FX_FLOAT startAngle,
             FX_FLOAT endAngle);
  void MoveTo(const CFX_PointF& p0) { MoveTo(p0.x, p0.y); }
  void LineTo(const CFX_PointF& p1) { LineTo(p1.x, p1.y); }
  void GetCurveTangents(const CFX_PointsF& points,
                        CFX_PointsF& tangents,
                        FX_BOOL bClosed,
                        FX_FLOAT fTension) const;
  CFX_PathData m_Path;
};

#endif  // XFA_FDE_FDE_GEOBJECT_H_
