Fix infinite recursion in cubic->quad conversion, also attempt to detect nearly flat cubics early.
Review URL: http://codereview.appspot.com/6448100/
THIS WILL REQUIRE REBASELINING OF CONVEXPATHS GM.
git-svn-id: http://skia.googlecode.com/svn/trunk@4917 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/convexpaths.cpp b/gm/convexpaths.cpp
index d1c6aee..f6c3383 100644
--- a/gm/convexpaths.cpp
+++ b/gm/convexpaths.cpp
@@ -40,7 +40,7 @@
virtual SkISize onISize() {
- return make_isize(1200, 900);
+ return make_isize(1200, 1100);
}
void makePaths() {
@@ -48,7 +48,6 @@
return;
}
fOnce.accomplished();
-
// CW
fPaths.push_back().moveTo(0, 0);
fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
@@ -126,14 +125,14 @@
fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
- /*
- It turns out arcTos are not automatically marked as convex and they
- may in fact be ever so slightly concave.
- fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
- 50 * SK_Scalar1,
- 100 * SK_Scalar1),
- 25 * SK_Scalar1, 130 * SK_Scalar1, false);
- */
+
+ //It turns out arcTos are not automatically marked as convex and they
+ //may in fact be ever so slightly concave.
+ //fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
+ // 50 * SK_Scalar1,
+ // 100 * SK_Scalar1),
+ // 25 * SK_Scalar1, 130 * SK_Scalar1, false);
+
// cubics
fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1,
10 * SK_Scalar1, 90 * SK_Scalar1,
@@ -141,7 +140,7 @@
fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
20 * SK_Scalar1, 100 * SK_Scalar1,
0 * SK_Scalar1, 0 * SK_Scalar1);
-
+
// path that has a cubic with a repeated first control point and
// a repeated last control point.
fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10);
@@ -163,6 +162,30 @@
50 * SK_Scalar1, 0,
50 * SK_Scalar1, 10 * SK_Scalar1);
+ // cubic where last three points are almost a line
+ fPaths.push_back().moveTo(0, 228 * SK_Scalar1 / 8);
+ fPaths.back().cubicTo(628 * SK_Scalar1 / 8, 82 * SK_Scalar1 / 8,
+ 1255 * SK_Scalar1 / 8, 141 * SK_Scalar1 / 8,
+ 1883 * SK_Scalar1 / 8, 202 * SK_Scalar1 / 8);
+
+ // flat cubic where the at end point tangents both point outward.
+ fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(0, SK_Scalar1,
+ 30 * SK_Scalar1, SK_Scalar1,
+ 20 * SK_Scalar1, 0);
+
+ // flat cubic where initial tangent is in, end tangent out
+ fPaths.push_back().moveTo(0, 0 * SK_Scalar1);
+ fPaths.back().cubicTo(10 * SK_Scalar1, SK_Scalar1,
+ 30 * SK_Scalar1, SK_Scalar1,
+ 20 * SK_Scalar1, 0);
+
+ // flat cubic where initial tangent is out, end tangent in
+ fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(0, SK_Scalar1,
+ 20 * SK_Scalar1, SK_Scalar1,
+ 30 * SK_Scalar1, 0);
+
// triangle where one edge is a degenerate quad
fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1,