blob: cf4a990aa6b08c964341a48206612f240d1c227c [file] [log] [blame]
// Copyright 2015 The Chromium 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 "flutter/lib/ui/painting/path.h"
#include <math.h>
#include "flutter/lib/ui/painting/matrix.h"
#include "lib/tonic/dart_args.h"
#include "lib/tonic/dart_binding_macros.h"
#include "lib/tonic/converter/dart_converter.h"
#include "lib/tonic/dart_library_natives.h"
namespace blink {
typedef CanvasPath Path;
static void Path_constructor(Dart_NativeArguments args) {
DartCallConstructor(&CanvasPath::Create, args);
}
IMPLEMENT_WRAPPERTYPEINFO(ui, Path);
#define FOR_EACH_BINDING(V) \
V(Path, getFillType) \
V(Path, setFillType) \
V(Path, moveTo) \
V(Path, relativeMoveTo) \
V(Path, lineTo) \
V(Path, relativeLineTo) \
V(Path, quadraticBezierTo) \
V(Path, relativeQuadraticBezierTo) \
V(Path, cubicTo) \
V(Path, relativeCubicTo) \
V(Path, conicTo) \
V(Path, relativeConicTo) \
V(Path, arcTo) \
V(Path, addRect) \
V(Path, addOval) \
V(Path, addArc) \
V(Path, addPolygon) \
V(Path, addRRect) \
V(Path, addPath) \
V(Path, extendWithPath) \
V(Path, close) \
V(Path, reset) \
V(Path, contains) \
V(Path, shift) \
V(Path, transform)
FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
void CanvasPath::RegisterNatives(tonic::DartLibraryNatives* natives) {
natives->Register({{"Path_constructor", Path_constructor, 1, true},
FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
}
CanvasPath::CanvasPath() {}
CanvasPath::~CanvasPath() {}
int CanvasPath::getFillType() {
return path_.getFillType();
}
void CanvasPath::setFillType(int fill_type) {
path_.setFillType(static_cast<SkPath::FillType>(fill_type));
}
void CanvasPath::moveTo(float x, float y) {
path_.moveTo(x, y);
}
void CanvasPath::relativeMoveTo(float x, float y) {
path_.rMoveTo(x, y);
}
void CanvasPath::lineTo(float x, float y) {
path_.lineTo(x, y);
}
void CanvasPath::relativeLineTo(float x, float y) {
path_.rLineTo(x, y);
}
void CanvasPath::quadraticBezierTo(float x1, float y1, float x2, float y2) {
path_.quadTo(x1, y1, x2, y2);
}
void CanvasPath::relativeQuadraticBezierTo(float x1,
float y1,
float x2,
float y2) {
path_.rQuadTo(x1, y1, x2, y2);
}
void CanvasPath::cubicTo(float x1,
float y1,
float x2,
float y2,
float x3,
float y3) {
path_.cubicTo(x1, y1, x2, y2, x3, y3);
}
void CanvasPath::relativeCubicTo(float x1,
float y1,
float x2,
float y2,
float x3,
float y3) {
path_.rCubicTo(x1, y1, x2, y2, x3, y3);
}
void CanvasPath::conicTo(float x1, float y1, float x2, float y2, float w) {
path_.conicTo(x1, y1, x2, y2, w);
}
void CanvasPath::relativeConicTo(float x1,
float y1,
float x2,
float y2,
float w) {
path_.rConicTo(x1, y1, x2, y2, w);
}
void CanvasPath::arcTo(float left,
float top,
float right,
float bottom,
float startAngle,
float sweepAngle,
bool forceMoveTo) {
path_.arcTo(SkRect::MakeLTRB(left, top, right, bottom),
startAngle * 180.0 / M_PI, sweepAngle * 180.0 / M_PI,
forceMoveTo);
}
void CanvasPath::addRect(float left, float top, float right, float bottom) {
path_.addRect(SkRect::MakeLTRB(left, top, right, bottom));
}
void CanvasPath::addOval(float left, float top, float right, float bottom) {
path_.addOval(SkRect::MakeLTRB(left, top, right, bottom));
}
void CanvasPath::addArc(float left,
float top,
float right,
float bottom,
float startAngle,
float sweepAngle) {
path_.addArc(SkRect::MakeLTRB(left, top, right, bottom),
startAngle * 180.0 / M_PI, sweepAngle * 180.0 / M_PI);
}
void CanvasPath::addPolygon(const tonic::Float32List& points, bool close) {
path_.addPoly(reinterpret_cast<const SkPoint*>(points.data()),
points.num_elements() / 2, close);
}
void CanvasPath::addRRect(const RRect& rrect) {
path_.addRRect(rrect.sk_rrect);
}
void CanvasPath::addPath(CanvasPath* path, double dx, double dy) {
if (path)
path_.addPath(path->path(), dx, dy, SkPath::kAppend_AddPathMode);
}
void CanvasPath::extendWithPath(CanvasPath* path, double dx, double dy) {
if (path)
path_.addPath(path->path(), dx, dy, SkPath::kExtend_AddPathMode);
}
void CanvasPath::close() {
path_.close();
}
void CanvasPath::reset() {
path_.reset();
}
bool CanvasPath::contains(double x, double y) {
return path_.contains(x, y);
}
ftl::RefPtr<CanvasPath> CanvasPath::shift(double dx, double dy) {
ftl::RefPtr<CanvasPath> path = CanvasPath::Create();
path_.offset(dx, dy, &path->path_);
return path;
}
ftl::RefPtr<CanvasPath> CanvasPath::transform(
const tonic::Float64List& matrix4) {
ftl::RefPtr<CanvasPath> path = CanvasPath::Create();
path_.transform(ToSkMatrix(matrix4), &path->path_);
return path;
}
} // namespace blink