Index: src/pathops/SkPathOpsCubic.cpp |
=================================================================== |
--- src/pathops/SkPathOpsCubic.cpp (revision 9425) |
+++ src/pathops/SkPathOpsCubic.cpp (working copy) |
@@ -403,11 +403,23 @@ |
/* by = */ dst[1].fY = (my * 2 - ny) / 18; |
/* cx = */ dst[2].fX = (nx * 2 - mx) / 18; |
/* cy = */ dst[2].fY = (ny * 2 - my) / 18; |
+ // FIXME: call align() ? |
return dst; |
} |
+void SkDCubic::align(int endIndex, int ctrlIndex, SkDPoint* dstPt) const { |
+ if (fPts[endIndex].fX == fPts[ctrlIndex].fX) { |
+ dstPt->fX = fPts[endIndex].fX; |
+ } |
+ if (fPts[endIndex].fY == fPts[ctrlIndex].fY) { |
+ dstPt->fY = fPts[endIndex].fY; |
+ } |
+} |
+ |
void SkDCubic::subDivide(const SkDPoint& a, const SkDPoint& d, |
double t1, double t2, SkDPoint dst[2]) const { |
+ SkASSERT(t1 != t2); |
+#if 0 |
double ex = interp_cubic_coords(&fPts[0].fX, (t1 * 2 + t2) / 3); |
double ey = interp_cubic_coords(&fPts[0].fY, (t1 * 2 + t2) / 3); |
double fx = interp_cubic_coords(&fPts[0].fX, (t1 + t2 * 2) / 3); |
@@ -420,6 +432,30 @@ |
/* by = */ dst[0].fY = (my * 2 - ny) / 18; |
/* cx = */ dst[1].fX = (nx * 2 - mx) / 18; |
/* cy = */ dst[1].fY = (ny * 2 - my) / 18; |
+#else |
+ // this approach assumes that the control points computed directly are accurate enough |
+ SkDCubic sub = subDivide(t1, t2); |
+ dst[0] = sub[1] + (a - sub[0]); |
+ dst[1] = sub[2] + (d - sub[3]); |
+#endif |
+ if (t1 == 0 || t2 == 0) { |
+ align(0, 1, t1 == 0 ? &dst[0] : &dst[1]); |
+ } |
+ if (t1 == 1 || t2 == 1) { |
+ align(3, 2, t1 == 1 ? &dst[0] : &dst[1]); |
+ } |
+ if (precisely_subdivide_equal(dst[0].fX, a.fX)) { |
+ dst[0].fX = a.fX; |
+ } |
+ if (precisely_subdivide_equal(dst[0].fY, a.fY)) { |
+ dst[0].fY = a.fY; |
+ } |
+ if (precisely_subdivide_equal(dst[1].fX, d.fX)) { |
+ dst[1].fX = d.fX; |
+ } |
+ if (precisely_subdivide_equal(dst[1].fY, d.fY)) { |
+ dst[1].fY = d.fY; |
+ } |
} |
/* classic one t subdivision */ |