blob: a9a59acb6ac0b734bd4eafabe759306ba19f0f17 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00007
reed@google.com63c1ad82011-04-18 14:15:36 +00008#include "Test.h"
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00009#include "TestClassDef.h"
rileya@google.com589708b2012-07-26 20:04:23 +000010#include "gradients/SkClampRange.h"
reed@google.com63c1ad82011-04-18 14:15:36 +000011#include "SkRandom.h"
12
13static skiatest::Reporter* gReporter;
14
reed@google.com13659f12011-04-18 19:59:38 +000015static void debug_me() {
16 if (NULL == gReporter) {
17 SkDebugf("dsfdssd\n");
18 }
19}
20
21#ifdef USE_REPORTER
22
23#define R_ASSERT(cond) \
24 do { if (!(cond)) { \
25 debug_me(); \
26 REPORTER_ASSERT(gReporter, cond); \
27 }} while (0)
28
29#else
30#define R_ASSERT(cond) \
31 do { if (!(cond)) { \
32 debug_me(); \
33 }} while (0)
34#endif
35
reed@google.com63c1ad82011-04-18 14:15:36 +000036static int classify_value(SkFixed fx, int v0, int v1) {
37 if (fx <= 0) {
38 return v0;
39 }
40 if (fx >= 0xFFFF) {
41 return v1;
42 }
reed@google.com13659f12011-04-18 19:59:38 +000043 R_ASSERT(false);
reed@google.com63c1ad82011-04-18 14:15:36 +000044 return 0;
45}
46
47#define V0 -42
48#define V1 1024
49
50static void slow_check(const SkClampRange& range,
51 SkFixed fx, SkFixed dx, int count) {
52 SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count);
reed@google.com13659f12011-04-18 19:59:38 +000053
reed@google.com63c1ad82011-04-18 14:15:36 +000054 int i;
reed@google.com13659f12011-04-18 19:59:38 +000055 if (range.fOverflowed) {
56 fx = range.fFx1;
57 for (i = 0; i < range.fCount1; i++) {
58 R_ASSERT(fx >= 0 && fx <= 0xFFFF);
59 fx += dx;
60 }
61 } else {
62 for (i = 0; i < range.fCount0; i++) {
63 int v = classify_value(fx, V0, V1);
64 R_ASSERT(v == range.fV0);
65 fx += dx;
66 }
67 if (range.fCount1 > 0 && fx != range.fFx1) {
68 SkDebugf("%x %x\n", fx, range.fFx1);
mtklein@google.com330313a2013-08-22 15:37:26 +000069 R_ASSERT(false); // bad fFx1
reed@google.com13659f12011-04-18 19:59:38 +000070 return;
71 }
72 for (i = 0; i < range.fCount1; i++) {
73 R_ASSERT(fx >= 0 && fx <= 0xFFFF);
74 fx += dx;
75 }
76 for (i = 0; i < range.fCount2; i++) {
77 int v = classify_value(fx, V0, V1);
78 R_ASSERT(v == range.fV1);
79 fx += dx;
80 }
reed@google.com63c1ad82011-04-18 14:15:36 +000081 }
82}
83
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000084
reed@google.com63c1ad82011-04-18 14:15:36 +000085static void test_range(SkFixed fx, SkFixed dx, int count) {
86 SkClampRange range;
87 range.init(fx, dx, count, V0, V1);
88 slow_check(range, fx, dx, count);
89}
90
91#define ff(x) SkIntToFixed(x)
92
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000093DEF_TEST(ClampRange, reporter) {
reed@google.com63c1ad82011-04-18 14:15:36 +000094 gReporter = reporter;
95
96 test_range(0, 0, 20);
97 test_range(0xFFFF, 0, 20);
98 test_range(-ff(2), 0, 20);
99 test_range( ff(2), 0, 20);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000100
reed@google.com63c1ad82011-04-18 14:15:36 +0000101 test_range(-10, 1, 20);
102 test_range(10, -1, 20);
103 test_range(-10, 3, 20);
104 test_range(10, -3, 20);
reed@google.com13659f12011-04-18 19:59:38 +0000105
106 test_range(ff(1), ff(16384), 100);
107 test_range(ff(-1), ff(-16384), 100);
108 test_range(ff(1)/2, ff(16384), 100);
109 test_range(ff(1)/2, ff(-16384), 100);
110
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000111 SkRandom rand;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000112
reed@google.com63c1ad82011-04-18 14:15:36 +0000113 // test non-overflow cases
114 for (int i = 0; i < 1000000; i++) {
115 SkFixed fx = rand.nextS() >> 1;
116 SkFixed sx = rand.nextS() >> 1;
117 int count = rand.nextU() % 1000 + 1;
118 SkFixed dx = (sx - fx) / count;
119 test_range(fx, dx, count);
120 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000121
reed@google.com63c1ad82011-04-18 14:15:36 +0000122 // test overflow cases
reed@google.com13659f12011-04-18 19:59:38 +0000123 for (int i = 0; i < 100000; i++) {
reed@google.com63c1ad82011-04-18 14:15:36 +0000124 SkFixed fx = rand.nextS();
reed@google.com13659f12011-04-18 19:59:38 +0000125 SkFixed dx = rand.nextS();
reed@google.com63c1ad82011-04-18 14:15:36 +0000126 int count = rand.nextU() % 1000 + 1;
reed@google.com63c1ad82011-04-18 14:15:36 +0000127 test_range(fx, dx, count);
128 }
129}