ColorFilterTest.cpp revision 43c50c8c77df82c5cffb55cae2d386e59802b88f
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "Test.h" 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SkColor.h" 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SkColorFilter.h" 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SkRandom.h" 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "SkXfermode.h" 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic SkFlattenable* reincarnate_flattenable(SkFlattenable* obj) { 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkFlattenable::Factory fact = obj->getFactory(); 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (NULL == fact) { 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkFlattenableWriteBuffer wb(1024); 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org obj->flatten(wb); 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t size = wb.size(); 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkAutoSMalloc<1024> storage(size); 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // make a copy into storage 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wb.flatten(storage.get()); 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkFlattenableReadBuffer rb(storage.get(), size); 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return fact(rb); 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename T> T* reincarnate(T* obj) { 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (T*)reincarnate_flattenable(obj); 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/////////////////////////////////////////////////////////////////////////////// 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ILLEGAL_MODE ((SkXfermode::Mode)-1) 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void test_asColorMode(skiatest::Reporter* reporter) { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkRandom rand; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int mode = 0; mode <= SkXfermode::kLastMode; mode++) { 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkColor color = rand.nextU(); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // ensure we always get a filter, by avoiding the possibility of a 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // special case that would return NULL (if color's alpha is 0 or 0xFF) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color = SkColorSetA(color, 0x7F); 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkColorFilter* cf = SkColorFilter::CreateModeFilter(color, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (SkXfermode::Mode)mode); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // allow for no filter if we're in Dst mode (its a no op) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (SkXfermode::kDst_Mode == mode && NULL == cf) { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SkAutoUnref aur(cf); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org REPORTER_ASSERT(reporter, cf); 53 54 SkColor c = ~color; 55 SkXfermode::Mode m = ILLEGAL_MODE; 56 57 SkColor expectedColor = color; 58 SkXfermode::Mode expectedMode = (SkXfermode::Mode)mode; 59 60// SkDebugf("--- mc [%d %x] ", mode, color); 61 62 REPORTER_ASSERT(reporter, cf->asColorMode(&c, &m)); 63 // handle special-case folding by the factory 64 if (SkXfermode::kClear_Mode == mode) { 65 if (c != expectedColor) { 66 expectedColor = 0; 67 } 68 if (m != expectedMode) { 69 expectedMode = SkXfermode::kSrc_Mode; 70 } 71 } 72 73// SkDebugf("--- got [%d %x] expected [%d %x]\n", m, c, expectedMode, expectedColor); 74 75 REPORTER_ASSERT(reporter, c == expectedColor); 76 REPORTER_ASSERT(reporter, m == expectedMode); 77 78 { 79 SkColorFilter* cf2 = reincarnate(cf); 80 SkAutoUnref aur2(cf2); 81 REPORTER_ASSERT(reporter, cf2); 82 83 SkColor c2 = ~color; 84 SkXfermode::Mode m2 = ILLEGAL_MODE; 85 REPORTER_ASSERT(reporter, cf2->asColorMode(&c2, &m2)); 86 REPORTER_ASSERT(reporter, c2 == expectedColor); 87 REPORTER_ASSERT(reporter, m2 == expectedMode); 88 } 89 } 90} 91 92#include "TestClassDef.h" 93DEFINE_TESTCLASS("ColorFilter", ColorFilterTestClass, test_asColorMode) 94