135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "Test.h" 235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "SkClampRange.h" 335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "SkRandom.h" 435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic skiatest::Reporter* gReporter; 635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void debug_me() { 835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (NULL == gReporter) { 935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkDebugf("dsfdssd\n"); 1035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 1135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 1235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#ifdef USE_REPORTER 1435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define R_ASSERT(cond) \ 1635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger do { if (!(cond)) { \ 1735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger debug_me(); \ 1835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(gReporter, cond); \ 1935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger }} while (0) 2035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#else 2235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define R_ASSERT(cond) \ 2335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger do { if (!(cond)) { \ 2435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger debug_me(); \ 2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger }} while (0) 2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#endif 2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 2835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic int classify_value(SkFixed fx, int v0, int v1) { 2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (fx <= 0) { 3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return v0; 3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 3235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (fx >= 0xFFFF) { 3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return v1; 3435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(false); 3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return 0; 3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 3835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 3935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define V0 -42 4035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define V1 1024 4135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 4235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void slow_check(const SkClampRange& range, 4335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed fx, SkFixed dx, int count) { 4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count); 4535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int i; 4735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (range.fOverflowed) { 4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fx = range.fFx1; 4935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (i = 0; i < range.fCount1; i++) { 5035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(fx >= 0 && fx <= 0xFFFF); 5135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fx += dx; 5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 5335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } else { 5435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (i = 0; i < range.fCount0; i++) { 5535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int v = classify_value(fx, V0, V1); 5635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(v == range.fV0); 5735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fx += dx; 5835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 5935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger if (range.fCount1 > 0 && fx != range.fFx1) { 6035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkDebugf("%x %x\n", fx, range.fFx1); 6135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(!"bad fFx1"); 6235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger return; 6335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 6435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (i = 0; i < range.fCount1; i++) { 6535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(fx >= 0 && fx <= 0xFFFF); 6635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fx += dx; 6735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 6835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (i = 0; i < range.fCount2; i++) { 6935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int v = classify_value(fx, V0, V1); 7035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger R_ASSERT(v == range.fV1); 7135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger fx += dx; 7235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 7335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 7435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void test_range(SkFixed fx, SkFixed dx, int count) { 7735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkClampRange range; 7835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger range.init(fx, dx, count, V0, V1); 7935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger slow_check(range, fx, dx, count); 8035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 8135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 8235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define ff(x) SkIntToFixed(x) 8335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 8435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid TestClampRange(skiatest::Reporter* reporter); 8535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid TestClampRange(skiatest::Reporter* reporter) { 8635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger gReporter = reporter; 8735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 8835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(0, 0, 20); 8935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(0xFFFF, 0, 20); 9035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(-ff(2), 0, 20); 9135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range( ff(2), 0, 20); 9235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(-10, 1, 20); 9435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(10, -1, 20); 9535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(-10, 3, 20); 9635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(10, -3, 20); 9735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 9835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(ff(1), ff(16384), 100); 9935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(ff(-1), ff(-16384), 100); 10035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(ff(1)/2, ff(16384), 100); 10135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(ff(1)/2, ff(-16384), 100); 10235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 10335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkRandom rand; 10435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 10535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // test non-overflow cases 10635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (int i = 0; i < 1000000; i++) { 10735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed fx = rand.nextS() >> 1; 10835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed sx = rand.nextS() >> 1; 10935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int count = rand.nextU() % 1000 + 1; 11035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed dx = (sx - fx) / count; 11135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(fx, dx, count); 11235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 11335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 11435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // test overflow cases 11535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger for (int i = 0; i < 100000; i++) { 11635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed fx = rand.nextS(); 11735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkFixed dx = rand.nextS(); 11835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int count = rand.nextU() % 1000 + 1; 11935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_range(fx, dx, count); 12035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger } 12135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 12235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 12335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#ifdef USE_REPORTER 12435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 12535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "TestClassDef.h" 12635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerDEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange) 12735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 12835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#endif 129