Index: src/core/SkGeometry.cpp |
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp |
index 5e77dd3d152849eefcf0768264a6e57cae5b9738..45658a03c32a4faea9090a1d856db6543389dcfc 100644 |
--- a/src/core/SkGeometry.cpp |
+++ b/src/core/SkGeometry.cpp |
@@ -1205,8 +1205,7 @@ static SkScalar quad_solve(SkScalar a, SkScalar b, SkScalar c, SkScalar d) |
} |
/* 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. |
+ the new off-curve point and endpoint into 'dest'. |
Should only return false if the computed pos is the start of the curve |
(i.e. root == 0) |
*/ |
@@ -1232,7 +1231,7 @@ static bool truncate_last_curve(const SkPoint quad[3], SkScalar x, SkScalar y, S |
SkPoint tmp[5]; |
SkChopQuadAt(quad, tmp, t); |
dest[0] = tmp[1]; |
- dest[1] = tmp[2]; |
+ dest[1].set(x, y); |
return true; |
} else { |
/* t == 0 means either the value triggered a root outside of [0, 1) |
@@ -1260,44 +1259,38 @@ static bool truncate_last_curve(const SkPoint quad[3], SkScalar x, SkScalar y, S |
#ifdef SK_SCALAR_IS_FLOAT |
// Due to floating point issues (i.e., 1.0f - SK_ScalarRoot2Over2 != |
-// SK_ScalarRoot2Over2 - SK_ScalarTanPIOver8) a cruder root2over2 |
-// approximation is required to make the quad circle points convex. The |
-// root of the problem is that with the root2over2 value in SkScalar.h |
-// the arcs really are ever so slightly concave. Some alternative fixes |
-// to this problem (besides just arbitrarily pushing out the mid-point as |
-// is done here) are: |
-// Adjust all the points (not just the middle) to both better approximate |
-// the curve and remain convex |
-// Switch over to using cubics rather then quads |
-// Use a different method to create the mid-point (e.g., compute |
-// the two side points, average them, then move it out as needed |
-#define SK_ScalarRoot2Over2_QuadCircle 0.7072f |
- |
+// SK_ScalarRoot2Over2 - SK_ScalarTanPIOver8), the "correct" off curve |
+// control points cause the quadratic circle approximation to be concave. |
+// SK_OffEps is used to pull in the off-curve control points a bit |
+// to make the quadratic approximation convex. |
+// Pulling the off-curve controls points in is preferable to pushing some |
+// of the on-curve points off. |
+#define SK_OffEps 0.0001f |
#else |
- #define SK_ScalarRoot2Over2_QuadCircle SK_FixedRoot2Over2 |
+#define SK_OffEps 0 |
#endif |
static const SkPoint gQuadCirclePts[kSkBuildQuadArcStorage] = { |
{ SK_Scalar1, 0 }, |
- { SK_Scalar1, SK_ScalarTanPIOver8 }, |
- { SK_ScalarRoot2Over2_QuadCircle, SK_ScalarRoot2Over2_QuadCircle }, |
- { SK_ScalarTanPIOver8, SK_Scalar1 }, |
+ { SK_Scalar1 - SK_OffEps, SK_ScalarTanPIOver8 - SK_OffEps }, |
+ { SK_ScalarRoot2Over2, SK_ScalarRoot2Over2 }, |
+ { SK_ScalarTanPIOver8 - SK_OffEps, SK_Scalar1 - SK_OffEps }, |
{ 0, SK_Scalar1 }, |
- { -SK_ScalarTanPIOver8, SK_Scalar1 }, |
- { -SK_ScalarRoot2Over2_QuadCircle, SK_ScalarRoot2Over2_QuadCircle }, |
- { -SK_Scalar1, SK_ScalarTanPIOver8 }, |
+ { -SK_ScalarTanPIOver8 + SK_OffEps,SK_Scalar1 - SK_OffEps }, |
+ { -SK_ScalarRoot2Over2, SK_ScalarRoot2Over2 }, |
+ { -SK_Scalar1 + SK_OffEps, SK_ScalarTanPIOver8 - SK_OffEps }, |
{ -SK_Scalar1, 0 }, |
- { -SK_Scalar1, -SK_ScalarTanPIOver8 }, |
- { -SK_ScalarRoot2Over2_QuadCircle, -SK_ScalarRoot2Over2_QuadCircle }, |
- { -SK_ScalarTanPIOver8, -SK_Scalar1 }, |
+ { -SK_Scalar1 + SK_OffEps, -SK_ScalarTanPIOver8 + SK_OffEps }, |
+ { -SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2 }, |
+ { -SK_ScalarTanPIOver8 + SK_OffEps,-SK_Scalar1 + SK_OffEps }, |
{ 0, -SK_Scalar1 }, |
- { SK_ScalarTanPIOver8, -SK_Scalar1 }, |
- { SK_ScalarRoot2Over2_QuadCircle, -SK_ScalarRoot2Over2_QuadCircle }, |
- { SK_Scalar1, -SK_ScalarTanPIOver8 }, |
+ { SK_ScalarTanPIOver8 - SK_OffEps, -SK_Scalar1 + SK_OffEps }, |
+ { SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2 }, |
+ { SK_Scalar1 - SK_OffEps, -SK_ScalarTanPIOver8 + SK_OffEps }, |
{ SK_Scalar1, 0 } |
}; |