• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Test.h"
2 #include "SkClampRange.h"
3 #include "SkRandom.h"
4 
5 static skiatest::Reporter* gReporter;
6 
debug_me()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 
classify_value(SkFixed fx,int v0,int v1)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 
slow_check(const SkClampRange & range,SkFixed fx,SkFixed dx,int count)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 
test_range(SkFixed fx,SkFixed dx,int count)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);
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