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 |