Unit test and bug fixes for cubic Bezier clipping.
git-svn-id: http://skia.googlecode.com/svn/trunk@102 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkCubicClipper.cpp b/src/core/SkCubicClipper.cpp
index 9022ff3..d11eb99 100644
--- a/src/core/SkCubicClipper.cpp
+++ b/src/core/SkCubicClipper.cpp
@@ -122,39 +122,41 @@
bool reverse;
// we need the data to be monotonically descending in Y
- if (srcPts[0].fY > srcPts[2].fY) {
+ if (srcPts[0].fY > srcPts[3].fY) {
dst[0] = srcPts[3];
dst[1] = srcPts[2];
dst[2] = srcPts[1];
dst[3] = srcPts[0];
reverse = true;
} else {
- memcpy(dst, srcPts, 3 * sizeof(SkPoint));
+ memcpy(dst, srcPts, 4 * sizeof(SkPoint));
reverse = false;
}
// are we completely above or below
const SkScalar ctop = fClip.fTop;
const SkScalar cbot = fClip.fBottom;
- if (dst[2].fY <= ctop || dst[0].fY >= cbot) {
+ if (dst[3].fY <= ctop || dst[0].fY >= cbot) {
return false;
}
SkScalar t;
- SkPoint tmp[5]; // for SkChopCubicAt
+ SkPoint tmp[7]; // for SkChopCubicAt
// are we partially above
if (dst[0].fY < ctop && chopMonoCubicAtY(dst, ctop, &t)) {
SkChopCubicAt(dst, tmp, t);
- dst[0] = tmp[2];
- dst[1] = tmp[3];
+ dst[0] = tmp[3];
+ dst[1] = tmp[4];
+ dst[2] = tmp[5];
}
// are we partially below
- if (dst[2].fY > cbot && chopMonoCubicAtY(dst, cbot, &t)) {
+ if (dst[3].fY > cbot && chopMonoCubicAtY(dst, cbot, &t)) {
SkChopCubicAt(dst, tmp, t);
dst[1] = tmp[1];
dst[2] = tmp[2];
+ dst[3] = tmp[3];
}
if (reverse) {