Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkArithmeticMode.h" | |
| 9 #include "SkLerpXfermode.h" | |
| 10 #include "SkPixelXorXfermode.h" | |
| 11 #include "SkStream.h" | |
| 12 #include "SkValue.h" | |
| 13 #include "SkXfermode.h" | |
| 8 #include "Test.h" | 14 #include "Test.h" |
| 9 #include "SkValue.h" | 15 |
| 16 static void dump(const SkValue&, SkWStream*); | |
| 17 | |
| 18 template <class T> | |
| 19 void test_value(skiatest::Reporter* r, T* object, SkValue::Type type) { | |
| 20 SkValue val = object->asValue(); | |
| 21 object->unref(); | |
| 22 REPORTER_ASSERT(r, type == val.type()); | |
| 23 if (r->verbose()) { | |
| 24 SkDebugWStream debugWStream; | |
| 25 dump(val, &debugWStream); | |
| 26 SkDebugf("\n"); | |
| 27 } | |
| 28 } | |
| 29 | |
| 30 DEF_TEST(Value_Xfermode, r) { | |
|
mtklein
2016/01/15 00:25:22
Let's test SkValue with new types scoped to this f
hal.canary
2016/01/15 13:38:56
okay.
| |
| 31 SkAutoTUnref<SkXfermode> xfermode( | |
| 32 SkXfermode::Create(SkXfermode::kDstOver_Mode)); | |
| 33 SkValue val = xfermode->asValue(); | |
| 34 REPORTER_ASSERT(r, SkValue::ProcCoeffXfermode == val.type()); | |
| 35 SkValue valCopy = val; | |
| 36 REPORTER_ASSERT(r, SkValue::ProcCoeffXfermode == valCopy.type()); | |
| 37 | |
| 38 const SkValue* mode = val.get(0 /* ProcCoeffXfermode_Mode */); | |
| 39 REPORTER_ASSERT(r, mode); | |
| 40 if (mode) { | |
| 41 REPORTER_ASSERT(r, (uint32_t)SkXfermode::kDstOver_Mode == mode->u32()); | |
| 42 } | |
| 43 | |
| 44 test_value(r, xfermode.detach(), SkValue::ProcCoeffXfermode); | |
| 45 test_value(r, SkArithmeticMode::Create(0.125f, 0.25f, 0.375f, 0.5f, true), | |
| 46 SkValue::ArithmeticXfermode); | |
| 47 test_value(r, SkLerpXfermode::Create(1.0f/3.0f), SkValue::LerpXfermode); | |
| 48 test_value(r, SkPixelXorXfermode::Create(0xFF00FF00), | |
| 49 SkValue::PixelXorXfermode); | |
| 50 } | |
| 51 | |
| 52 static bool skwstream_printf(SkWStream* wstream, const char format[], ...) { | |
| 53 char buffer[128]; | |
| 54 va_list args; | |
| 55 va_start(args, format); | |
| 56 #ifdef SK_BUILD_FOR_WIN | |
| 57 int written = | |
| 58 _vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, format, args); | |
| 59 #else | |
| 60 int written = vsnprintf(buffer, sizeof(buffer), format, args); | |
| 61 #endif | |
| 62 va_end(args); | |
| 63 if (written >= 0 && written < SkToInt(sizeof(buffer))) { | |
| 64 return wstream->write(buffer, SkToSizeT(written)); | |
| 65 } | |
| 66 SkDEBUGFAIL(""); | |
| 67 return false; | |
| 68 } | |
| 69 | |
| 70 #include <inttypes.h> | |
| 71 | |
| 72 #ifndef PRId32 | |
| 73 #define PRId32 "d" | |
|
mtklein
2016/01/15 00:25:22
Why are you making this complicated? Just write %
hal.canary
2016/01/15 13:38:56
that assumes that ints are 32 bits.
mtklein
2016/01/15 14:16:08
ints are 32 bits.
| |
| 74 #define PRIu32 "u" | |
| 75 #endif | |
| 76 | |
| 77 #define OBJECTS(M) \ | |
| 78 M(ArithmeticXfermode) \ | |
| 79 M(LerpXfermode) \ | |
| 80 M(OverdrawXfermode) \ | |
| 81 M(PixelXorXfermode) \ | |
| 82 M(ProcCoeffXfermode) | |
| 83 | |
| 84 static void dump_object(const char* name, const SkValue& val, SkWStream* o) { | |
| 85 skwstream_printf(o, "[ \"%s\", {\n", name); | |
| 86 // todo: sort keys | |
| 87 val.foreach([=](SkValue::Key k, const SkValue& v){ | |
| 88 skwstream_printf(o, " \"key_%" PRIu32 "\" : ", k); | |
| 89 dump(v, o); | |
| 90 o->writeText(",\n"); | |
| 91 }); | |
| 92 o->writeText("} ]\n"); | |
| 93 } | |
| 94 static void dump(const SkValue& val, SkWStream* o) { | |
|
mtklein
2016/01/15 00:25:22
Just use SkDebugf?
hal.canary
2016/01/15 13:38:56
Ease of reuse. I may eventually reuse this code a
mtklein
2016/01/15 14:16:08
I don't care unless you actually do it. Don't wri
| |
| 95 switch (val.type()) { | |
| 96 case SkValue::Null: | |
| 97 o->writeText("[ \"Null\", null ]"); | |
| 98 return; | |
| 99 case SkValue::S32: | |
| 100 skwstream_printf(o, "[ \"S32\", %" PRId32 " ]", val.s32()); | |
| 101 return; | |
| 102 case SkValue::U32: | |
| 103 skwstream_printf(o, "[ \"U32\", %" PRIu32 " ]", val.u32()); | |
| 104 return; | |
| 105 case SkValue::F32: | |
| 106 skwstream_printf(o, "[ \"F32\", %.9g ]", val.f32()); | |
| 107 return; | |
| 108 #define FN(OBJECT) \ | |
| 109 case SkValue::OBJECT: dump_object(#OBJECT, val, o); return; | |
| 110 OBJECTS(FN) | |
| 111 #undef FN | |
| 112 default: | |
| 113 SkASSERT(false); | |
| 114 } | |
| 115 } | |
| OLD | NEW |