Index: src/pathops/SkPathOpsCurve.h |
=================================================================== |
--- src/pathops/SkPathOpsCurve.h (revision 0) |
+++ src/pathops/SkPathOpsCurve.h (revision 0) |
@@ -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.xyAtT(t); |
+} |
+ |
+static SkDPoint dquad_xy_at_t(const SkPoint a[3], double t) { |
+ SkDQuad quad; |
+ quad.set(a); |
+ return quad.xyAtT(t); |
+} |
+ |
+static SkDPoint dcubic_xy_at_t(const SkPoint a[4], double t) { |
+ SkDCubic cubic; |
+ cubic.set(a); |
+ return cubic.xyAtT(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.xyAtT(startT), line.xyAtT(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 |