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