// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "path_ops.h"

namespace flutter {
SkPath* CreatePath(SkPathFillType fill_type) {
  auto* path = new SkPath();
  path->setFillType(fill_type);
  return path;
}

void DestroyPath(SkPath* path) {
  delete path;
}

void MoveTo(SkPath* path, SkScalar x, SkScalar y) {
  path->moveTo(x, y);
}

void LineTo(SkPath* path, SkScalar x, SkScalar y) {
  path->lineTo(x, y);
}

void CubicTo(SkPath* path,
             SkScalar x1,
             SkScalar y1,
             SkScalar x2,
             SkScalar y2,
             SkScalar x3,
             SkScalar y3) {
  path->cubicTo(x1, y1, x2, y2, x3, y3);
}

void Close(SkPath* path) {
  path->close();
}

void Reset(SkPath* path) {
  path->reset();
}

void Op(SkPath* one, SkPath* two, SkPathOp op) {
  Op(*one, *two, op, one);
}

struct PathData* Data(SkPath* path) {
  int point_count = path->countPoints();
  int verb_count = path->countVerbs();

  auto data = new PathData();
  data->points = new float[point_count * 2];
  data->point_count = point_count * 2;
  data->verbs = new uint8_t[verb_count];
  data->verb_count = verb_count;

  path->getVerbs(data->verbs, verb_count);
  path->getPoints(reinterpret_cast<SkPoint*>(data->points), point_count);
  return data;
}

void DestroyData(PathData* data) {
  delete[] data->points;
  delete[] data->verbs;
  delete data;
}

}  // namespace flutter
