| 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 }
|
| };
|
|
|