// 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_FXGRAPHICS_CFX_PATH_GENERATOR_H_
#define XFA_FXGRAPHICS_CFX_PATH_GENERATOR_H_

#include <memory>

#include "core/fxge/include/cfx_pathdata.h"

class CFX_PathGenerator {
 public:
  CFX_PathGenerator();
  ~CFX_PathGenerator();

  CFX_PathData* GetPathData() const { return m_pPathData.get(); }

  void AddPathData(CFX_PathData* path_data);
  void AddPathData(FX_PATHPOINT* points, int count);

  void MoveTo(FX_FLOAT x, FX_FLOAT y);
  void LineTo(FX_FLOAT x, FX_FLOAT y);
  void BezierTo(FX_FLOAT ctrl_x1,
                FX_FLOAT ctrl_y1,
                FX_FLOAT ctrl_x2,
                FX_FLOAT ctrl_y2,
                FX_FLOAT to_x,
                FX_FLOAT to_y);
  void Close();
  void ArcTo(FX_FLOAT x,
             FX_FLOAT y,
             FX_FLOAT width,
             FX_FLOAT height,
             FX_FLOAT start_angle,
             FX_FLOAT sweep_angle);

  void AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
  void AddBezier(FX_FLOAT start_x,
                 FX_FLOAT start_y,
                 FX_FLOAT ctrl_x1,
                 FX_FLOAT ctrl_y1,
                 FX_FLOAT ctrl_x2,
                 FX_FLOAT ctrl_y2,
                 FX_FLOAT end_x,
                 FX_FLOAT end_y);
  void AddRectangle(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
  void AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height);
  void AddArc(FX_FLOAT x,
              FX_FLOAT y,
              FX_FLOAT width,
              FX_FLOAT height,
              FX_FLOAT start_angle,
              FX_FLOAT sweep_angle);
  void AddPie(FX_FLOAT x,
              FX_FLOAT y,
              FX_FLOAT width,
              FX_FLOAT height,
              FX_FLOAT start_angle,
              FX_FLOAT sweep_angle);

 protected:
  std::unique_ptr<CFX_PathData> m_pPathData;
};

#endif  // XFA_FXGRAPHICS_CFX_PATH_GENERATOR_H_
