ClampRangeTest.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "Test.h" 963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "SkClampRange.h" 1063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "SkRandom.h" 1163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 1263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic skiatest::Reporter* gReporter; 1363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 1413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comstatic void debug_me() { 1513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com if (NULL == gReporter) { 1613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com SkDebugf("dsfdssd\n"); 1713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 1813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com} 1913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 2013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#ifdef USE_REPORTER 2113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 2213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#define R_ASSERT(cond) \ 2313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com do { if (!(cond)) { \ 2413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com debug_me(); \ 2513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com REPORTER_ASSERT(gReporter, cond); \ 2613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com }} while (0) 2713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 2813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#else 2913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#define R_ASSERT(cond) \ 3013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com do { if (!(cond)) { \ 3113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com debug_me(); \ 3213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com }} while (0) 3313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#endif 3413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 3563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic int classify_value(SkFixed fx, int v0, int v1) { 3663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com if (fx <= 0) { 3763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com return v0; 3863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com } 3963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com if (fx >= 0xFFFF) { 4063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com return v1; 4163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com } 4213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(false); 4363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com return 0; 4463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com} 4563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 4663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define V0 -42 4763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define V1 1024 4863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 4963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic void slow_check(const SkClampRange& range, 5063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkFixed fx, SkFixed dx, int count) { 5163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count); 5213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 5363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com int i; 5413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com if (range.fOverflowed) { 5513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com fx = range.fFx1; 5613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com for (i = 0; i < range.fCount1; i++) { 5713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(fx >= 0 && fx <= 0xFFFF); 5813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com fx += dx; 5913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 6013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } else { 6113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com for (i = 0; i < range.fCount0; i++) { 6213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com int v = classify_value(fx, V0, V1); 6313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(v == range.fV0); 6413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com fx += dx; 6513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 6613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com if (range.fCount1 > 0 && fx != range.fFx1) { 6713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com SkDebugf("%x %x\n", fx, range.fFx1); 6813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(!"bad fFx1"); 6913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com return; 7013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 7113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com for (i = 0; i < range.fCount1; i++) { 7213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(fx >= 0 && fx <= 0xFFFF); 7313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com fx += dx; 7413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 7513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com for (i = 0; i < range.fCount2; i++) { 7613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com int v = classify_value(fx, V0, V1); 7713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com R_ASSERT(v == range.fV1); 7813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com fx += dx; 7913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com } 8063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com } 8163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com} 8263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 8363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic void test_range(SkFixed fx, SkFixed dx, int count) { 8463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkClampRange range; 8563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com range.init(fx, dx, count, V0, V1); 8663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com slow_check(range, fx, dx, count); 8763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com} 8863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 8963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define ff(x) SkIntToFixed(x) 9063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 9113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comvoid TestClampRange(skiatest::Reporter* reporter); 9213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comvoid TestClampRange(skiatest::Reporter* reporter) { 9363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com gReporter = reporter; 9463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 9563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(0, 0, 20); 9663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(0xFFFF, 0, 20); 9763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(-ff(2), 0, 20); 9863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range( ff(2), 0, 20); 9963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 10063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(-10, 1, 20); 10163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(10, -1, 20); 10263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(-10, 3, 20); 10363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(10, -3, 20); 10413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 10513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com test_range(ff(1), ff(16384), 100); 10613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com test_range(ff(-1), ff(-16384), 100); 10713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com test_range(ff(1)/2, ff(16384), 100); 10813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com test_range(ff(1)/2, ff(-16384), 100); 10913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 11063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkRandom rand; 11163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 11263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com // test non-overflow cases 11363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com for (int i = 0; i < 1000000; i++) { 11463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkFixed fx = rand.nextS() >> 1; 11563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkFixed sx = rand.nextS() >> 1; 11663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com int count = rand.nextU() % 1000 + 1; 11763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkFixed dx = (sx - fx) / count; 11863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(fx, dx, count); 11963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com } 12063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 12163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com // test overflow cases 12213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com for (int i = 0; i < 100000; i++) { 12363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com SkFixed fx = rand.nextS(); 12413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com SkFixed dx = rand.nextS(); 12563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com int count = rand.nextU() % 1000 + 1; 12663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com test_range(fx, dx, count); 12763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com } 12863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com} 12963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com 13013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#ifdef USE_REPORTER 13113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 13263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "TestClassDef.h" 13363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comDEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange) 13413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com 13513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#endif 136