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;
+}
+
+