Index: src/core/SkGeometry.cpp |
=================================================================== |
--- src/core/SkGeometry.cpp (revision 9903) |
+++ src/core/SkGeometry.cpp (working copy) |
@@ -1205,11 +1205,13 @@ |
return count == 1 ? roots[0] : 0; |
} |
-/* given a quad-curve and a point (x,y), chop the quad at that point and return |
- the new quad's offCurve point. Should only return false if the computed pos |
- is the start of the curve (i.e. root == 0) |
+/* given a quad-curve and a point (x,y), chop the quad at that point and place |
+ the new off-curve point and endpoint into 'dest'. The new end point is used |
+ (rather than (x,y)) to compensate for numerical inaccuracies. |
+ Should only return false if the computed pos is the start of the curve |
+ (i.e. root == 0) |
*/ |
-static bool quad_pt2OffCurve(const SkPoint quad[3], SkScalar x, SkScalar y, SkPoint* offCurve) |
+static bool truncate_last_curve(const SkPoint quad[3], SkScalar x, SkScalar y, SkPoint* dest) |
{ |
const SkScalar* base; |
SkScalar value; |
@@ -1230,7 +1232,8 @@ |
{ |
SkPoint tmp[5]; |
SkChopQuadAt(quad, tmp, t); |
- *offCurve = tmp[1]; |
+ dest[0] = tmp[1]; |
+ dest[1] = tmp[2]; |
return true; |
} else { |
/* t == 0 means either the value triggered a root outside of [0, 1) |
@@ -1247,7 +1250,8 @@ |
if ((base[0] < base[4] && value > base[2]) || |
(base[0] > base[4] && value < base[2])) // should root have been 1 |
{ |
- *offCurve = quad[1]; |
+ dest[0] = quad[1]; |
+ dest[1].set(x, y); |
return true; |
} |
} |
@@ -1360,9 +1364,8 @@ |
memcpy(quadPoints, gQuadCirclePts, (wholeCount + 1) * sizeof(SkPoint)); |
const SkPoint* arc = &gQuadCirclePts[wholeCount]; |
- if (quad_pt2OffCurve(arc, x, y, &quadPoints[wholeCount + 1])) |
+ if (truncate_last_curve(arc, x, y, &quadPoints[wholeCount + 1])) |
{ |
- quadPoints[wholeCount + 2].set(x, y); |
wholeCount += 2; |
} |
pointCount = wholeCount + 1; |