handle overflow
note: gradient caller doesn't so we can still draw wrong when the caller
converts its initial fx from float->fixed. Perhaps SkClampRange should offer
a float interface as well.



git-svn-id: http://skia.googlecode.com/svn/trunk@1149 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/ClampRangeTest.cpp b/tests/ClampRangeTest.cpp
index b3d1e78..be9c6ec 100644
--- a/tests/ClampRangeTest.cpp
+++ b/tests/ClampRangeTest.cpp
@@ -4,6 +4,27 @@
 
 static skiatest::Reporter* gReporter;
 
+static void debug_me() {
+    if (NULL == gReporter) {
+        SkDebugf("dsfdssd\n");
+    }
+}
+
+#ifdef USE_REPORTER
+
+#define R_ASSERT(cond)                  \
+    do { if (!(cond)) {                 \
+    debug_me();                         \
+    REPORTER_ASSERT(gReporter, cond);   \
+    }} while (0)
+
+#else
+#define R_ASSERT(cond)                  \
+    do { if (!(cond)) {                 \
+    debug_me();                         \
+    }} while (0)
+#endif
+
 static int classify_value(SkFixed fx, int v0, int v1) {
     if (fx <= 0) {
         return v0;
@@ -11,7 +32,7 @@
     if (fx >= 0xFFFF) {
         return v1;
     }
-    REPORTER_ASSERT(gReporter, false);
+    R_ASSERT(false);
     return 0;
 }
 
@@ -21,22 +42,34 @@
 static void slow_check(const SkClampRange& range,
                        SkFixed fx, SkFixed dx, int count) {
     SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count);
-    
+
     int i;
-    for (i = 0; i < range.fCount0; i++) {
-        int v = classify_value(fx, V0, V1);
-        REPORTER_ASSERT(gReporter, v == range.fV0);
-        fx += dx;
-    }
-    REPORTER_ASSERT(gReporter, range.fCount1 == 0 || fx == range.fFx1);
-    for (i = 0; i < range.fCount1; i++) {
-        REPORTER_ASSERT(gReporter, fx >= 0 && fx <= 0xFFFF);
-        fx += dx;
-    }
-    for (i = 0; i < range.fCount2; i++) {
-        int v = classify_value(fx, V0, V1);
-        REPORTER_ASSERT(gReporter, v == range.fV1);
-        fx += dx;
+    if (range.fOverflowed) {
+        fx = range.fFx1;
+        for (i = 0; i < range.fCount1; i++) {
+            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
+            fx += dx;
+        }
+    } else {
+        for (i = 0; i < range.fCount0; i++) {
+            int v = classify_value(fx, V0, V1);
+            R_ASSERT(v == range.fV0);
+            fx += dx;
+        }
+        if (range.fCount1 > 0 && fx != range.fFx1) {
+            SkDebugf("%x %x\n", fx, range.fFx1);
+            R_ASSERT(!"bad fFx1");
+            return;
+        }
+        for (i = 0; i < range.fCount1; i++) {
+            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
+            fx += dx;
+        }
+        for (i = 0; i < range.fCount2; i++) {
+            int v = classify_value(fx, V0, V1);
+            R_ASSERT(v == range.fV1);
+            fx += dx;
+        }
     }
 }
 
@@ -48,7 +81,8 @@
 
 #define ff(x)   SkIntToFixed(x)
 
-static void TestClampRange(skiatest::Reporter* reporter) {
+void TestClampRange(skiatest::Reporter* reporter);
+void TestClampRange(skiatest::Reporter* reporter) {
     gReporter = reporter;
 
     test_range(0, 0, 20);
@@ -60,7 +94,12 @@
     test_range(10, -1, 20);
     test_range(-10, 3, 20);
     test_range(10, -3, 20);
-    
+
+    test_range(ff(1),  ff(16384),  100);
+    test_range(ff(-1), ff(-16384), 100);
+    test_range(ff(1)/2, ff(16384), 100);
+    test_range(ff(1)/2, ff(-16384), 100);
+
     SkRandom rand;
     
     // test non-overflow cases
@@ -73,14 +112,17 @@
     }
     
     // test overflow cases
-    for (int i = 0; i < 0*1000000; i++) {
+    for (int i = 0; i < 100000; i++) {
         SkFixed fx = rand.nextS();
-        SkFixed sx = rand.nextS();
+        SkFixed dx = rand.nextS();
         int count = rand.nextU() % 1000 + 1;
-        SkFixed dx = (sx - fx) / count;
         test_range(fx, dx, count);
     }
 }
 
+#ifdef USE_REPORTER
+
 #include "TestClassDef.h"
 DEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange)
+
+#endif