1 #include "Test.h" 2 #include "SkClampRange.h" 3 #include "SkRandom.h" 4 5 static skiatest::Reporter* gReporter; 6 7 static void debug_me() { 8 if (NULL == gReporter) { 9 SkDebugf("dsfdssd\n"); 10 } 11 } 12 13 #ifdef USE_REPORTER 14 15 #define R_ASSERT(cond) \ 16 do { if (!(cond)) { \ 17 debug_me(); \ 18 REPORTER_ASSERT(gReporter, cond); \ 19 }} while (0) 20 21 #else 22 #define R_ASSERT(cond) \ 23 do { if (!(cond)) { \ 24 debug_me(); \ 25 }} while (0) 26 #endif 27 28 static int classify_value(SkFixed fx, int v0, int v1) { 29 if (fx <= 0) { 30 return v0; 31 } 32 if (fx >= 0xFFFF) { 33 return v1; 34 } 35 R_ASSERT(false); 36 return 0; 37 } 38 39 #define V0 -42 40 #define V1 1024 41 42 static void slow_check(const SkClampRange& range, 43 SkFixed fx, SkFixed dx, int count) { 44 SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count); 45 46 int i; 47 if (range.fOverflowed) { 48 fx = range.fFx1; 49 for (i = 0; i < range.fCount1; i++) { 50 R_ASSERT(fx >= 0 && fx <= 0xFFFF); 51 fx += dx; 52 } 53 } else { 54 for (i = 0; i < range.fCount0; i++) { 55 int v = classify_value(fx, V0, V1); 56 R_ASSERT(v == range.fV0); 57 fx += dx; 58 } 59 if (range.fCount1 > 0 && fx != range.fFx1) { 60 SkDebugf("%x %x\n", fx, range.fFx1); 61 R_ASSERT(!"bad fFx1"); 62 return; 63 } 64 for (i = 0; i < range.fCount1; i++) { 65 R_ASSERT(fx >= 0 && fx <= 0xFFFF); 66 fx += dx; 67 } 68 for (i = 0; i < range.fCount2; i++) { 69 int v = classify_value(fx, V0, V1); 70 R_ASSERT(v == range.fV1); 71 fx += dx; 72 } 73 } 74 } 75 76 static void test_range(SkFixed fx, SkFixed dx, int count) { 77 SkClampRange range; 78 range.init(fx, dx, count, V0, V1); 79 slow_check(range, fx, dx, count); 80 } 81 82 #define ff(x) SkIntToFixed(x) 83 84 void TestClampRange(skiatest::Reporter* reporter); 85 void TestClampRange(skiatest::Reporter* reporter) { 86 gReporter = reporter; 87 88 test_range(0, 0, 20); 89 test_range(0xFFFF, 0, 20); 90 test_range(-ff(2), 0, 20); 91 test_range( ff(2), 0, 20); 92 93 test_range(-10, 1, 20); 94 test_range(10, -1, 20); 95 test_range(-10, 3, 20); 96 test_range(10, -3, 20); 97 98 test_range(ff(1), ff(16384), 100); 99 test_range(ff(-1), ff(-16384), 100); 100 test_range(ff(1)/2, ff(16384), 100); 101 test_range(ff(1)/2, ff(-16384), 100); 102 103 SkRandom rand; 104 105 // test non-overflow cases 106 for (int i = 0; i < 1000000; i++) { 107 SkFixed fx = rand.nextS() >> 1; 108 SkFixed sx = rand.nextS() >> 1; 109 int count = rand.nextU() % 1000 + 1; 110 SkFixed dx = (sx - fx) / count; 111 test_range(fx, dx, count); 112 } 113 114 // test overflow cases 115 for (int i = 0; i < 100000; i++) { 116 SkFixed fx = rand.nextS(); 117 SkFixed dx = rand.nextS(); 118 int count = rand.nextU() % 1000 + 1; 119 test_range(fx, dx, count); 120 } 121 } 122 123 #ifdef USE_REPORTER 124 125 #include "TestClassDef.h" 126 DEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange) 127 128 #endif 129