// Copyright 2016 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_FXGRAPHICS_CFX_PATH_H_
#define XFA_FXGRAPHICS_CFX_PATH_H_

#include <memory>

#include "core/fxcrt/fx_system.h"
#include "xfa/fxgraphics/cfx_graphics.h"

class CFX_PathData;
class CFX_PathGenerator;

class CFX_Path final {
 public:
  CFX_Path();
  ~CFX_Path();

  FWL_Error Create();
  FWL_Error MoveTo(FX_FLOAT x, FX_FLOAT y);
  FWL_Error LineTo(FX_FLOAT x, FX_FLOAT y);
  FWL_Error BezierTo(FX_FLOAT ctrlX1,
                     FX_FLOAT ctrlY1,
                     FX_FLOAT ctrlX2,
                     FX_FLOAT ctrlY2,
                     FX_FLOAT toX,
                     FX_FLOAT toY);
  FWL_Error ArcTo(FX_FLOAT left,
                  FX_FLOAT top,
                  FX_FLOAT width,
                  FX_FLOAT height,
                  FX_FLOAT startAngle,
                  FX_FLOAT sweepAngle);
  FWL_Error Close();

  FWL_Error AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
  FWL_Error AddBezier(FX_FLOAT startX,
                      FX_FLOAT startY,
                      FX_FLOAT ctrlX1,
                      FX_FLOAT ctrlY1,
                      FX_FLOAT ctrlX2,
                      FX_FLOAT ctrlY2,
                      FX_FLOAT endX,
                      FX_FLOAT endY);
  FWL_Error AddRectangle(FX_FLOAT left,
                         FX_FLOAT top,
                         FX_FLOAT width,
                         FX_FLOAT height);
  FWL_Error AddEllipse(FX_FLOAT left,
                       FX_FLOAT top,
                       FX_FLOAT width,
                       FX_FLOAT height);
  FWL_Error AddEllipse(const CFX_RectF& rect);
  FWL_Error AddArc(FX_FLOAT left,
                   FX_FLOAT top,
                   FX_FLOAT width,
                   FX_FLOAT height,
                   FX_FLOAT startAngle,
                   FX_FLOAT sweepAngle);
  FWL_Error AddPie(FX_FLOAT left,
                   FX_FLOAT top,
                   FX_FLOAT width,
                   FX_FLOAT height,
                   FX_FLOAT startAngle,
                   FX_FLOAT sweepAngle);
  FWL_Error AddSubpath(CFX_Path* path);
  FWL_Error Clear();

  FX_BOOL IsEmpty() const;
  CFX_PathData* GetPathData() const;

 private:
  std::unique_ptr<CFX_PathGenerator> m_generator;
};

#endif  // XFA_FXGRAPHICS_CFX_PATH_H_
