detect when our quadratic is really linear for 2-point radial, and don't
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 23 Jun 2011 15:07:04 +0000 (15:07 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 23 Jun 2011 15:07:04 +0000 (15:07 +0000)
divide by zero, but rather just return -c/b

git-svn-id: http://skia.googlecode.com/svn/trunk@1684 2bbb7eff-a529-9590-31e7-b0007b416f81

src/effects/SkGradientShader.cpp

index cfe444e..89b9d34 100644 (file)
@@ -1476,6 +1476,9 @@ private:
 #ifdef SK_USE_SLOW_2POINT_RADIAL_GRADIENT
 static inline SkFixed two_point_radial(SkFixed b, SkFixed fx, SkFixed fy, SkFixed sr2d2, SkFixed foura, SkFixed oneOverTwoA, bool posRoot) {
     SkFixed c = SkFixedSquare(fx) + SkFixedSquare(fy) - sr2d2;
+    if (0 == foura) {
+        return SkFixedDiv(-c, b);
+    }
     SkFixed discrim = SkFixedSquare(b) - SkFixedMul(foura, c);
     if (discrim < 0) {
         discrim = -discrim;
@@ -1492,6 +1495,10 @@ static inline SkFixed two_point_radial(SkScalar b, SkScalar fx, SkScalar fy,
                                        SkScalar sr2d2, SkScalar foura,
                                        SkScalar oneOverTwoA, bool posRoot) {
     SkScalar c = SkScalarSquare(fx) + SkScalarSquare(fy) - sr2d2;
+    if (0 == foura) {
+        return SkScalarToFixed(SkScalarDiv(-c, b));
+    }
+
     SkScalar discrim = SkScalarSquare(b) - SkScalarMul(foura, c);
     if (discrim < 0) {
         discrim = -discrim;