// 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_CFDE_PATH_H_
#define XFA_FDE_CFDE_PATH_H_

#include "core/fxge/include/cfx_pathdata.h"
#include "core/fxge/include/cfx_renderdevice.h"
#include "xfa/fgas/crt/fgas_memory.h"

class CFDE_Path : public CFX_Target {
 public:
  FX_BOOL StartFigure();
  FX_BOOL CloseFigure();

  void AddBezier(const CFX_PointsF& points);
  void AddBeziers(const CFX_PointsF& points);
  void AddCurve(const CFX_PointsF& points,
                FX_BOOL bClosed,
                FX_FLOAT fTension = 0.5f);
  void AddEllipse(const CFX_RectF& rect);
  void AddLines(const CFX_PointsF& points);
  void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
  void AddPath(const CFDE_Path* pSrc, FX_BOOL bConnect);
  void AddPolygon(const CFX_PointsF& points);
  void AddRectangle(const CFX_RectF& rect);
  void GetBBox(CFX_RectF& bbox) const;
  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_CFDE_PATH_H_
