Index: tests/ValueTest.cpp |
diff --git a/tests/ValueTest.cpp b/tests/ValueTest.cpp |
index 220ef2f9aeceb43d318a2c2f3c250a837c9c25d4..52a76a9ff0487412b712fb5b1bc35ce53bea3c3c 100644 |
--- a/tests/ValueTest.cpp |
+++ b/tests/ValueTest.cpp |
@@ -5,5 +5,111 @@ |
* found in the LICENSE file. |
*/ |
-#include "Test.h" |
+#include "SkArithmeticMode.h" |
+#include "SkLerpXfermode.h" |
+#include "SkPixelXorXfermode.h" |
+#include "SkStream.h" |
#include "SkValue.h" |
+#include "SkXfermode.h" |
+#include "Test.h" |
+ |
+static void dump(const SkValue&, SkWStream*); |
+ |
+template <class T> |
+void test_value(skiatest::Reporter* r, T* object, SkValue::Type type) { |
+ SkValue val = object->asValue(); |
+ object->unref(); |
+ REPORTER_ASSERT(r, type == val.type()); |
+ if (r->verbose()) { |
+ SkDebugWStream debugWStream; |
+ dump(val, &debugWStream); |
+ SkDebugf("\n"); |
+ } |
+} |
+ |
+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.
|
+ SkAutoTUnref<SkXfermode> xfermode( |
+ SkXfermode::Create(SkXfermode::kDstOver_Mode)); |
+ SkValue val = xfermode->asValue(); |
+ REPORTER_ASSERT(r, SkValue::ProcCoeffXfermode == val.type()); |
+ SkValue valCopy = val; |
+ REPORTER_ASSERT(r, SkValue::ProcCoeffXfermode == valCopy.type()); |
+ |
+ const SkValue* mode = val.get(0 /* ProcCoeffXfermode_Mode */); |
+ REPORTER_ASSERT(r, mode); |
+ if (mode) { |
+ REPORTER_ASSERT(r, (uint32_t)SkXfermode::kDstOver_Mode == mode->u32()); |
+ } |
+ |
+ test_value(r, xfermode.detach(), SkValue::ProcCoeffXfermode); |
+ test_value(r, SkArithmeticMode::Create(0.125f, 0.25f, 0.375f, 0.5f, true), |
+ SkValue::ArithmeticXfermode); |
+ test_value(r, SkLerpXfermode::Create(1.0f/3.0f), SkValue::LerpXfermode); |
+ test_value(r, SkPixelXorXfermode::Create(0xFF00FF00), |
+ SkValue::PixelXorXfermode); |
+} |
+ |
+static bool skwstream_printf(SkWStream* wstream, const char format[], ...) { |
+ char buffer[128]; |
+ va_list args; |
+ va_start(args, format); |
+ #ifdef SK_BUILD_FOR_WIN |
+ int written = |
+ _vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, format, args); |
+ #else |
+ int written = vsnprintf(buffer, sizeof(buffer), format, args); |
+ #endif |
+ va_end(args); |
+ if (written >= 0 && written < SkToInt(sizeof(buffer))) { |
+ return wstream->write(buffer, SkToSizeT(written)); |
+ } |
+ SkDEBUGFAIL(""); |
+ return false; |
+} |
+ |
+#include <inttypes.h> |
+ |
+#ifndef PRId32 |
+#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.
|
+#define PRIu32 "u" |
+#endif |
+ |
+#define OBJECTS(M) \ |
+ M(ArithmeticXfermode) \ |
+ M(LerpXfermode) \ |
+ M(OverdrawXfermode) \ |
+ M(PixelXorXfermode) \ |
+ M(ProcCoeffXfermode) |
+ |
+static void dump_object(const char* name, const SkValue& val, SkWStream* o) { |
+ skwstream_printf(o, "[ \"%s\", {\n", name); |
+ // todo: sort keys |
+ val.foreach([=](SkValue::Key k, const SkValue& v){ |
+ skwstream_printf(o, " \"key_%" PRIu32 "\" : ", k); |
+ dump(v, o); |
+ o->writeText(",\n"); |
+ }); |
+ o->writeText("} ]\n"); |
+} |
+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
|
+ switch (val.type()) { |
+ case SkValue::Null: |
+ o->writeText("[ \"Null\", null ]"); |
+ return; |
+ case SkValue::S32: |
+ skwstream_printf(o, "[ \"S32\", %" PRId32 " ]", val.s32()); |
+ return; |
+ case SkValue::U32: |
+ skwstream_printf(o, "[ \"U32\", %" PRIu32 " ]", val.u32()); |
+ return; |
+ case SkValue::F32: |
+ skwstream_printf(o, "[ \"F32\", %.9g ]", val.f32()); |
+ return; |
+ #define FN(OBJECT) \ |
+ case SkValue::OBJECT: dump_object(#OBJECT, val, o); return; |
+ OBJECTS(FN) |
+ #undef FN |
+ default: |
+ SkASSERT(false); |
+ } |
+} |