diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-09 15:03:59 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-09 15:03:59 +0000 |
commit | e1b75b4096c8ba9a569ae33d580806edd3c4a97a (patch) | |
tree | 1ca16b4c5d9d64925fc416bd5c88ed4cf73d810b /src/core/SkGeometry.cpp | |
parent | 387db0a2e516ca01508f7d16433f84da2ea3b93b (diff) |
GM (and fix) for drawArc capping issue
https://codereview.chromium.org/18271003/
git-svn-id: http://skia.googlecode.com/svn/trunk@9928 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkGeometry.cpp')
-rw-r--r-- | src/core/SkGeometry.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp index f67758d2b4..a12f961948 100644 --- a/src/core/SkGeometry.cpp +++ b/src/core/SkGeometry.cpp @@ -1205,11 +1205,13 @@ static SkScalar quad_solve(SkScalar a, SkScalar b, SkScalar c, SkScalar d) 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 @@ static bool quad_pt2OffCurve(const SkPoint quad[3], SkScalar x, SkScalar y, SkPo { 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 @@ static bool quad_pt2OffCurve(const SkPoint quad[3], SkScalar x, SkScalar y, SkPo 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 @@ int SkBuildQuadArc(const SkVector& uStart, const SkVector& uStop, 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; |