diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-23 19:39:15 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-23 19:39:15 +0000 |
commit | 03ca64b832819564d958b70ee27a2134ff88c9c6 (patch) | |
tree | b5e80f57a2129cb26a3d9719f915f8dfba115731 | |
parent | 22999c61d8a89f8f5920dc3ad494a88f57718770 (diff) |
don't overclamp cubics (see skbug.com/1316)
BUG=
Review URL: https://codereview.chromium.org/15924003
git-svn-id: http://skia.googlecode.com/svn/trunk@9262 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gm/cubicpaths.cpp | 2 | ||||
-rw-r--r-- | src/core/SkEdgeClipper.cpp | 17 |
2 files changed, 8 insertions, 11 deletions
diff --git a/gm/cubicpaths.cpp b/gm/cubicpaths.cpp index 00a741234d..56ed7297f5 100644 --- a/gm/cubicpaths.cpp +++ b/gm/cubicpaths.cpp @@ -17,7 +17,7 @@ public: protected: SkString onShortName() { - return SkString("cubicpath"); + return SkString("clippedcubic"); } SkISize onISize() { return SkISize::Make(1240, 390); } diff --git a/src/core/SkEdgeClipper.cpp b/src/core/SkEdgeClipper.cpp index fa9c30f4a1..00a1dd2494 100644 --- a/src/core/SkEdgeClipper.cpp +++ b/src/core/SkEdgeClipper.cpp @@ -283,12 +283,12 @@ static void chop_cubic_in_Y(SkPoint pts[4], const SkRect& clip) { SkPoint tmp[7]; SkChopCubicAt(pts, tmp, t); - // tmp[3, 4, 5].fY should all be to the below clip.fTop, and - // still be monotonic in Y. Since we can't trust the numerics of + // tmp[3, 4, 5].fY should all be to the below clip.fTop. + // Since we can't trust the numerics of // the chopper, we force those conditions now tmp[3].fY = clip.fTop; clamp_ge(tmp[4].fY, clip.fTop); - clamp_ge(tmp[5].fY, tmp[4].fY); + clamp_ge(tmp[5].fY, clip.fTop); pts[0] = tmp[3]; pts[1] = tmp[4]; @@ -362,12 +362,12 @@ void SkEdgeClipper::clipMonoCubic(const SkPoint src[4], const SkRect& clip) { SkChopCubicAt(pts, tmp, t); this->appendVLine(clip.fLeft, tmp[0].fY, tmp[3].fY, reverse); - // tmp[3, 4, 5].fX should all be to the right of clip.fLeft, and - // still be monotonic in X. Since we can't trust the numerics of + // tmp[3, 4, 5].fX should all be to the right of clip.fLeft. + // Since we can't trust the numerics of // the chopper, we force those conditions now tmp[3].fX = clip.fLeft; clamp_ge(tmp[4].fX, clip.fLeft); - clamp_ge(tmp[5].fX, tmp[4].fX); + clamp_ge(tmp[5].fX, clip.fLeft); pts[0] = tmp[3]; pts[1] = tmp[4]; @@ -388,7 +388,7 @@ void SkEdgeClipper::clipMonoCubic(const SkPoint src[4], const SkRect& clip) { SkChopCubicAt(pts, tmp, t); tmp[3].fX = clip.fRight; clamp_le(tmp[2].fX, clip.fRight); - clamp_le(tmp[1].fX, tmp[2].fX); + clamp_le(tmp[1].fX, clip.fRight); this->appendCubic(tmp, reverse); this->appendVLine(clip.fRight, tmp[3].fY, tmp[6].fY, reverse); @@ -413,12 +413,9 @@ bool SkEdgeClipper::clipCubic(const SkPoint srcPts[4], const SkRect& clip) { SkPoint monoY[10]; int countY = SkChopCubicAtYExtrema(srcPts, monoY); for (int y = 0; y <= countY; y++) { - // sk_assert_monotonic_y(&monoY[y * 3], 4); SkPoint monoX[10]; int countX = SkChopCubicAtXExtrema(&monoY[y * 3], monoX); for (int x = 0; x <= countX; x++) { - // sk_assert_monotonic_y(&monoX[x * 3], 4); - // sk_assert_monotonic_x(&monoX[x * 3], 4); this->clipMonoCubic(&monoX[x * 3], clip); SkASSERT(fCurrVerb - fVerbs < kMaxVerbs); SkASSERT(fCurrPoint - fPoints <= kMaxPoints); |