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