add boundary patch experiment
git-svn-id: http://skia.googlecode.com/svn/trunk@407 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/SkBoundaryPatch.cpp b/experimental/SkBoundaryPatch.cpp
new file mode 100644
index 0000000..1644f72
--- /dev/null
+++ b/experimental/SkBoundaryPatch.cpp
@@ -0,0 +1,54 @@
+#include "SkBoundaryPatch.h"
+
+SkBoundaryPatch::SkBoundaryPatch() {
+ sk_bzero(fCurve, sizeof(fCurve));
+};
+
+SkBoundaryPatch::~SkBoundaryPatch() {
+ for (int i = 0; i < 4; i++) {
+ SkSafeUnref(fCurve[i]);
+ }
+}
+
+SkBoundaryCurve* SkBoundaryPatch::setCurve(Edge e, SkBoundaryCurve* curve) {
+ SkASSERT((unsigned)e < 4);
+
+ SkRefCnt_SafeAssign(fCurve[e], curve);
+ return curve;
+}
+
+static SkPoint SkMakePoint(SkScalar x, SkScalar y) {
+ SkPoint pt;
+ pt.set(x, y);
+ return pt;
+}
+
+static SkPoint SkPointInterp(const SkPoint& a, const SkPoint& b, SkScalar t) {
+ return SkMakePoint(SkScalarInterp(a.fX, b.fX, t),
+ SkScalarInterp(a.fY, b.fY, t));
+}
+
+SkPoint SkBoundaryPatch::evaluate(SkScalar unitU, SkScalar unitV) {
+ SkPoint u = SkPointInterp(fCurve[kLeft]->evaluate(unitV),
+ fCurve[kRight]->evaluate(unitV), unitU);
+ SkPoint v = SkPointInterp(fCurve[kTop]->evaluate(unitU),
+ fCurve[kBottom]->evaluate(unitU), unitV);
+ return SkMakePoint(SkScalarAve(u.fX, v.fX),
+ SkScalarAve(u.fY, v.fY));
+}
+
+////////////////////////////////////////////////////////////////////////
+
+#include "SkGeometry.h"
+
+SkPoint SkLineBoundaryCurve::evaluate(SkScalar t) {
+ return SkPointInterp(fPts[0], fPts[1], t);
+}
+
+SkPoint SkCubicBoundaryCurve::evaluate(SkScalar t) {
+ SkPoint loc;
+ SkEvalCubicAt(fPts, t, &loc, NULL, NULL);
+ return loc;
+}
+
+