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