| Index: src/core/SkGeometry.cpp
|
| diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
|
| index f07ca2a10190fe99591c682d92a4fc6b31af1e7f..6295202764b7d8c3e7c84fb47e46a5d0c7cb4f30 100644
|
| --- a/src/core/SkGeometry.cpp
|
| +++ b/src/core/SkGeometry.cpp
|
| @@ -68,32 +68,18 @@ bool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2], bool* ambiguous)
|
| involving integer multiplies by 2 or 3, but fewer calls to SkScalarMul.
|
| May also introduce overflow of fixed when we compute our setup.
|
| */
|
| -#ifdef SK_SCALAR_IS_FIXED
|
| - #define DIRECT_EVAL_OF_POLYNOMIALS
|
| -#endif
|
| +// #define DIRECT_EVAL_OF_POLYNOMIALS
|
|
|
| ////////////////////////////////////////////////////////////////////////
|
|
|
| -#ifdef SK_SCALAR_IS_FIXED
|
| - static int is_not_monotonic(int a, int b, int c, int d)
|
| - {
|
| - return (((a - b) | (b - c) | (c - d)) & ((b - a) | (c - b) | (d - c))) >> 31;
|
| - }
|
| -
|
| - static int is_not_monotonic(int a, int b, int c)
|
| - {
|
| - return (((a - b) | (b - c)) & ((b - a) | (c - b))) >> 31;
|
| - }
|
| -#else
|
| - static int is_not_monotonic(float a, float b, float c)
|
| - {
|
| - float ab = a - b;
|
| - float bc = b - c;
|
| - if (ab < 0)
|
| - bc = -bc;
|
| - return ab == 0 || bc < 0;
|
| +static int is_not_monotonic(float a, float b, float c) {
|
| + float ab = a - b;
|
| + float bc = b - c;
|
| + if (ab < 0) {
|
| + bc = -bc;
|
| }
|
| -#endif
|
| + return ab == 0 || bc < 0;
|
| +}
|
|
|
| ////////////////////////////////////////////////////////////////////////
|
|
|
| @@ -141,23 +127,11 @@ int SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2])
|
|
|
| SkScalar* r = roots;
|
|
|
| -#ifdef SK_SCALAR_IS_FLOAT
|
| float R = B*B - 4*A*C;
|
| if (R < 0 || SkScalarIsNaN(R)) { // complex roots
|
| return 0;
|
| }
|
| R = sk_float_sqrt(R);
|
| -#else
|
| - Sk64 RR, tmp;
|
| -
|
| - RR.setMul(B,B);
|
| - tmp.setMul(A,C);
|
| - tmp.shiftLeft(2);
|
| - RR.sub(tmp);
|
| - if (RR.isNeg())
|
| - return 0;
|
| - SkFixed R = RR.getSqrt();
|
| -#endif
|
|
|
| SkScalar Q = (B < 0) ? -(B-R)/2 : -(B+R)/2;
|
| r += valid_unit_divide(Q, A, r);
|
| @@ -172,25 +146,8 @@ int SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2])
|
| return (int)(r - roots);
|
| }
|
|
|
| -#ifdef SK_SCALAR_IS_FIXED
|
| -/** Trim A/B/C down so that they are all <= 32bits
|
| - and then call SkFindUnitQuadRoots()
|
| -*/
|
| -static int Sk64FindFixedQuadRoots(const Sk64& A, const Sk64& B, const Sk64& C, SkFixed roots[2])
|
| -{
|
| - int na = A.shiftToMake32();
|
| - int nb = B.shiftToMake32();
|
| - int nc = C.shiftToMake32();
|
| -
|
| - int shift = SkMax32(na, SkMax32(nb, nc));
|
| - SkASSERT(shift >= 0);
|
| -
|
| - return SkFindUnitQuadRoots(A.getShiftRight(shift), B.getShiftRight(shift), C.getShiftRight(shift), roots);
|
| -}
|
| -#endif
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////
|
| -/////////////////////////////////////////////////////////////////////////////////////
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +///////////////////////////////////////////////////////////////////////////////
|
|
|
| static SkScalar eval_quad(const SkScalar src[], SkScalar t)
|
| {
|
| @@ -297,11 +254,7 @@ int SkFindQuadExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar tValue[1])
|
| /* At + B == 0
|
| t = -B / A
|
| */
|
| -#ifdef SK_SCALAR_IS_FIXED
|
| - return is_not_monotonic(a, b, c) && valid_unit_divide(a - b, a - b - b + c, tValue);
|
| -#else
|
| return valid_unit_divide(a - b, a - b - b + c, tValue);
|
| -#endif
|
| }
|
|
|
| static inline void flatten_double_quad_extrema(SkScalar coords[14])
|
| @@ -401,31 +354,7 @@ float SkFindQuadMaxCurvature(const SkPoint src[3]) {
|
| SkScalar By = src[0].fY - src[1].fY - src[1].fY + src[2].fY;
|
| SkScalar t = 0; // 0 means don't chop
|
|
|
| -#ifdef SK_SCALAR_IS_FLOAT
|
| (void)valid_unit_divide(-(Ax * Bx + Ay * By), Bx * Bx + By * By, &t);
|
| -#else
|
| - // !!! should I use SkFloat here? seems like it
|
| - Sk64 numer, denom, tmp;
|
| -
|
| - numer.setMul(Ax, -Bx);
|
| - tmp.setMul(Ay, -By);
|
| - numer.add(tmp);
|
| -
|
| - if (numer.isPos()) // do nothing if numer <= 0
|
| - {
|
| - denom.setMul(Bx, Bx);
|
| - tmp.setMul(By, By);
|
| - denom.add(tmp);
|
| - SkASSERT(!denom.isNeg());
|
| - if (numer < denom)
|
| - {
|
| - t = numer.getFixedDiv(denom);
|
| - SkASSERT(t >= 0 && t <= SK_Fixed1); // assert that we're numerically stable (ha!)
|
| - if ((unsigned)t >= SK_Fixed1) // runtime check for numerical stability
|
| - t = 0; // ignore the chop
|
| - }
|
| - }
|
| -#endif
|
| return t;
|
| }
|
|
|
| @@ -441,11 +370,7 @@ int SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5])
|
| }
|
| }
|
|
|
| -#ifdef SK_SCALAR_IS_FLOAT
|
| - #define SK_ScalarTwoThirds (0.666666666f)
|
| -#else
|
| - #define SK_ScalarTwoThirds ((SkFixed)(43691))
|
| -#endif
|
| +#define SK_ScalarTwoThirds (0.666666666f)
|
|
|
| void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]) {
|
| const SkScalar scale = SK_ScalarTwoThirds;
|
| @@ -553,11 +478,6 @@ void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc, SkVector* tan
|
| */
|
| int SkFindCubicExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar d, SkScalar tValues[2])
|
| {
|
| -#ifdef SK_SCALAR_IS_FIXED
|
| - if (!is_not_monotonic(a, b, c, d))
|
| - return 0;
|
| -#endif
|
| -
|
| // we divide A,B,C by 3 to simplify
|
| SkScalar A = d - a + 3*(b - c);
|
| SkScalar B = 2*(a - b - b + c);
|
| @@ -747,29 +667,8 @@ int SkFindCubicInflections(const SkPoint src[4], SkScalar tValues[])
|
| SkScalar By = src[2].fY - 2 * src[1].fY + src[0].fY;
|
| SkScalar Cx = src[3].fX + 3 * (src[1].fX - src[2].fX) - src[0].fX;
|
| SkScalar Cy = src[3].fY + 3 * (src[1].fY - src[2].fY) - src[0].fY;
|
| - int count;
|
| -
|
| -#ifdef SK_SCALAR_IS_FLOAT
|
| - count = SkFindUnitQuadRoots(Bx*Cy - By*Cx, Ax*Cy - Ay*Cx, Ax*By - Ay*Bx, tValues);
|
| -#else
|
| - Sk64 A, B, C, tmp;
|
| -
|
| - A.setMul(Bx, Cy);
|
| - tmp.setMul(By, Cx);
|
| - A.sub(tmp);
|
| -
|
| - B.setMul(Ax, Cy);
|
| - tmp.setMul(Ay, Cx);
|
| - B.sub(tmp);
|
|
|
| - C.setMul(Ax, By);
|
| - tmp.setMul(Ay, Bx);
|
| - C.sub(tmp);
|
| -
|
| - count = Sk64FindFixedQuadRoots(A, B, C, tValues);
|
| -#endif
|
| -
|
| - return count;
|
| + return SkFindUnitQuadRoots(Bx*Cy - By*Cx, Ax*Cy - Ay*Cx, Ax*By - Ay*Bx, tValues);
|
| }
|
|
|
| int SkChopCubicAtInflections(const SkPoint src[], SkPoint dst[10])
|
| @@ -891,10 +790,6 @@ static void test_collaps_duplicates() {
|
| }
|
| #endif
|
|
|
| -#if defined _WIN32 && _MSC_VER >= 1300 && defined SK_SCALAR_IS_FIXED // disable warning : unreachable code if building fixed point for windows desktop
|
| -#pragma warning ( disable : 4702 )
|
| -#endif
|
| -
|
| static SkScalar SkScalarCubeRoot(SkScalar x) {
|
| return sk_float_pow(x, 0.3333333f);
|
| }
|
|
|