/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkPathOpsCurve_DEFINE #define SkPathOpsCurve_DEFINE #include "SkPathOpsCubic.h" #include "SkPathOpsLine.h" #include "SkPathOpsQuad.h" static SkDPoint dline_xy_at_t(const SkPoint a[2], double t) { SkDLine line; line.set(a); return line.ptAtT(t); } static SkDPoint dquad_xy_at_t(const SkPoint a[3], double t) { SkDQuad quad; quad.set(a); return quad.ptAtT(t); } static SkDPoint dcubic_xy_at_t(const SkPoint a[4], double t) { SkDCubic cubic; cubic.set(a); return cubic.ptAtT(t); } static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], double ) = { NULL, dline_xy_at_t, dquad_xy_at_t, dcubic_xy_at_t }; static SkPoint fline_xy_at_t(const SkPoint a[2], double t) { return dline_xy_at_t(a, t).asSkPoint(); } static SkPoint fquad_xy_at_t(const SkPoint a[3], double t) { return dquad_xy_at_t(a, t).asSkPoint(); } static SkPoint fcubic_xy_at_t(const SkPoint a[4], double t) { return dcubic_xy_at_t(a, t).asSkPoint(); } static SkPoint (* const CurvePointAtT[])(const SkPoint[], double ) = { NULL, fline_xy_at_t, fquad_xy_at_t, fcubic_xy_at_t }; static SkDVector dline_dxdy_at_t(const SkPoint a[2], double ) { SkDLine line; line.set(a); return line[1] - line[0]; } static SkDVector dquad_dxdy_at_t(const SkPoint a[3], double t) { SkDQuad quad; quad.set(a); return quad.dxdyAtT(t); } static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], double t) { SkDCubic cubic; cubic.set(a); return cubic.dxdyAtT(t); } static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], double ) = { NULL, dline_dxdy_at_t, dquad_dxdy_at_t, dcubic_dxdy_at_t }; static SkVector fline_dxdy_at_t(const SkPoint a[2], double ) { return a[1] - a[0]; } static SkVector fquad_dxdy_at_t(const SkPoint a[3], double t) { return dquad_dxdy_at_t(a, t).asSkVector(); } static SkVector fcubic_dxdy_at_t(const SkPoint a[4], double t) { return dcubic_dxdy_at_t(a, t).asSkVector(); } static SkVector (* const CurveSlopeAtT[])(const SkPoint[], double ) = { NULL, fline_dxdy_at_t, fquad_dxdy_at_t, fcubic_dxdy_at_t }; static SkPoint quad_top(const SkPoint a[3], double startT, double endT) { SkDQuad quad; quad.set(a); SkDPoint topPt = quad.top(startT, endT); return topPt.asSkPoint(); } static SkPoint cubic_top(const SkPoint a[4], double startT, double endT) { SkDCubic cubic; cubic.set(a); SkDPoint topPt = cubic.top(startT, endT); return topPt.asSkPoint(); } static SkPoint (* const CurveTop[])(const SkPoint[], double , double ) = { NULL, NULL, quad_top, cubic_top }; static bool line_is_vertical(const SkPoint a[2], double startT, double endT) { SkDLine line; line.set(a); SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; return AlmostEqualUlps(dst[0].fX, dst[1].fX); } static bool quad_is_vertical(const SkPoint a[3], double startT, double endT) { SkDQuad quad; quad.set(a); SkDQuad dst = quad.subDivide(startT, endT); return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, dst[2].fX); } static bool cubic_is_vertical(const SkPoint a[4], double startT, double endT) { SkDCubic cubic; cubic.set(a); SkDCubic dst = cubic.subDivide(startT, endT); return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, dst[2].fX) && AlmostEqualUlps(dst[2].fX, dst[3].fX); } static bool (* const CurveIsVertical[])(const SkPoint[], double , double) = { NULL, line_is_vertical, quad_is_vertical, cubic_is_vertical }; #endif