aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/SkColor4fTest.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-02-08 12:56:56 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-08 12:56:57 -0800
commit3125565804054691b110b4731bc5a32070fab780 (patch)
tree9025e54e4d523d4cd2c87363ebc841f0f5a2b871 /tests/SkColor4fTest.cpp
parent21eaf3b00aa23ec352b595d5c54dd2c0faa0b0c6 (diff)
extend modecolorfilter to 4f
Diffstat (limited to 'tests/SkColor4fTest.cpp')
-rw-r--r--tests/SkColor4fTest.cpp46
1 files changed, 44 insertions, 2 deletions
diff --git a/tests/SkColor4fTest.cpp b/tests/SkColor4fTest.cpp
index 48a0c38286..b9dcd0d35e 100644
--- a/tests/SkColor4fTest.cpp
+++ b/tests/SkColor4fTest.cpp
@@ -168,9 +168,9 @@ DEF_TEST(Color4f_colorfilter, reporter) {
SkColorFilter* (*fFact)();
bool fSupports4f;
} recs[] = {
- { make_mode_cf, false },
+ { make_mode_cf, true },
{ make_mx_cf, true },
- { make_compose_cf, false },
+ { make_compose_cf, true },
};
// prepare the src
@@ -197,3 +197,45 @@ DEF_TEST(Color4f_colorfilter, reporter) {
}
}
}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+typedef SkPM4f (*SkXfermodeProc4f)(const SkPM4f& src, const SkPM4f& dst);
+
+static bool compare_procs(SkXfermodeProc proc32, SkXfermodeProc4f proc4f) {
+ const float kTolerance = 1.0f / 255;
+
+ const SkColor colors[] = {
+ 0, 0xFF000000, 0xFFFFFFFF, 0x80FF0000
+ };
+
+ for (auto s32 : colors) {
+ SkPMColor s_pm32 = SkPreMultiplyColor(s32);
+ SkPM4f s_pm4f = SkColor4f::FromColor(s32).premul();
+ for (auto d32 : colors) {
+ SkPMColor d_pm32 = SkPreMultiplyColor(d32);
+ SkPM4f d_pm4f = SkColor4f::FromColor(d32).premul();
+
+ SkPMColor r32 = proc32(s_pm32, d_pm32);
+ SkPM4f r4f = proc4f(s_pm4f, d_pm4f);
+
+ SkPM4f r32_4f = SkPM4f::FromPMColor(r32);
+ if (!nearly_equal(r4f, r32_4f, kTolerance)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+// Check that our Proc and Proc4f return (nearly) the same results
+//
+DEF_TEST(Color4f_xfermode_proc4f, reporter) {
+ // TODO: extend xfermodes so that all cases can be tested.
+ //
+ for (int mode = SkXfermode::kClear_Mode; mode <= SkXfermode::kScreen_Mode; ++mode) {
+ SkXfermodeProc proc32 = SkXfermode::GetProc((SkXfermode::Mode)mode);
+ SkXfermodeProc4f proc4f = SkXfermode::GetProc4f((SkXfermode::Mode)mode);
+ REPORTER_ASSERT(reporter, compare_procs(proc32, proc4f));
+ }
+}