1#include "Test.h" 2#include "SkColor.h" 3#include "SkColorFilter.h" 4#include "SkRandom.h" 5#include "SkXfermode.h" 6 7static SkFlattenable* reincarnate_flattenable(SkFlattenable* obj) { 8 SkFlattenable::Factory fact = obj->getFactory(); 9 if (NULL == fact) { 10 return NULL; 11 } 12 13 SkFlattenableWriteBuffer wb(1024); 14 obj->flatten(wb); 15 16 size_t size = wb.size(); 17 SkAutoSMalloc<1024> storage(size); 18 // make a copy into storage 19 wb.flatten(storage.get()); 20 21 SkFlattenableReadBuffer rb(storage.get(), size); 22 return fact(rb); 23} 24 25template <typename T> T* reincarnate(T* obj) { 26 return (T*)reincarnate_flattenable(obj); 27} 28 29/////////////////////////////////////////////////////////////////////////////// 30 31#define ILLEGAL_MODE ((SkXfermode::Mode)-1) 32 33static void test_asColorMode(skiatest::Reporter* reporter) { 34 SkRandom rand; 35 36 for (int mode = 0; mode <= SkXfermode::kLastMode; mode++) { 37 SkColor color = rand.nextU(); 38 39 // ensure we always get a filter, by avoiding the possibility of a 40 // special case that would return NULL (if color's alpha is 0 or 0xFF) 41 color = SkColorSetA(color, 0x7F); 42 43 SkColorFilter* cf = SkColorFilter::CreateModeFilter(color, 44 (SkXfermode::Mode)mode); 45 46 // allow for no filter if we're in Dst mode (its a no op) 47 if (SkXfermode::kDst_Mode == mode && NULL == cf) { 48 continue; 49 } 50 51 SkAutoUnref aur(cf); 52 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