diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/pathops/SkPathOpsCurve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/pathops/SkPathOpsCurve.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,152 @@ +/* + * 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