Index: tests/ColorFilterTest.cpp |
diff --git a/tests/ColorFilterTest.cpp b/tests/ColorFilterTest.cpp |
index b2e37183b5e7b223cf1d545ee8138a5311e68b64..d0b0d77ed43a8a1547b07f501c49850194d65e0e 100644 |
--- a/tests/ColorFilterTest.cpp |
+++ b/tests/ColorFilterTest.cpp |
@@ -147,3 +147,89 @@ DEF_TEST(LumaColorFilter, reporter) { |
REPORTER_ASSERT(reporter, SkGetPackedB32(out) == 0); |
} |
} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "SkColorMatrixFilter.h" |
+ |
+static void get_brightness_matrix(float amount, float matrix[20]) { |
+ // Spec implementation |
+ // (http://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#brightnessEquivalent) |
+ // <feFunc[R|G|B] type="linear" slope="[amount]"> |
+ memset(matrix, 0, 20 * sizeof(SkScalar)); |
+ matrix[0] = matrix[6] = matrix[12] = amount; |
+ matrix[18] = 1.f; |
+} |
+ |
+static void get_grayscale_matrix(float amount, float matrix[20]) { |
+ // Note, these values are computed to ensure MatrixNeedsClamping is false |
+ // for amount in [0..1] |
+ matrix[0] = 0.2126f + 0.7874f * amount; |
+ matrix[1] = 0.7152f - 0.7152f * amount; |
+ matrix[2] = 1.f - (matrix[0] + matrix[1]); |
+ matrix[3] = matrix[4] = 0.f; |
+ |
+ matrix[5] = 0.2126f - 0.2126f * amount; |
+ matrix[6] = 0.7152f + 0.2848f * amount; |
+ matrix[7] = 1.f - (matrix[5] + matrix[6]); |
+ matrix[8] = matrix[9] = 0.f; |
+ |
+ matrix[10] = 0.2126f - 0.2126f * amount; |
+ matrix[11] = 0.7152f - 0.7152f * amount; |
+ matrix[12] = 1.f - (matrix[10] + matrix[11]); |
+ matrix[13] = matrix[14] = 0.f; |
+ |
+ matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0.f; |
+ matrix[18] = 1.f; |
+} |
+ |
+static SkColorFilter* make_cf0() { |
+ SkScalar matrix[20]; |
+ get_brightness_matrix(0.5f, matrix); |
+ return SkColorMatrixFilter::Create(matrix); |
+} |
+static SkColorFilter* make_cf1() { |
+ SkScalar matrix[20]; |
+ get_grayscale_matrix(1, matrix); |
+ return SkColorMatrixFilter::Create(matrix); |
+} |
+static SkColorFilter* make_cf2() { |
+ SkColorMatrix m0, m1; |
+ get_brightness_matrix(0.5f, m0.fMat); |
+ get_grayscale_matrix(1, m1.fMat); |
+ m0.preConcat(m1); |
+ return SkColorMatrixFilter::Create(m0); |
+} |
+static SkColorFilter* make_cf3() { |
+ SkColorMatrix m0, m1; |
+ get_brightness_matrix(0.5f, m0.fMat); |
+ get_grayscale_matrix(1, m1.fMat); |
+ m0.postConcat(m1); |
+ return SkColorMatrixFilter::Create(m0); |
+} |
+typedef SkColorFilter* (*CFProc)(); |
+ |
+// Test that a colormatrix that "should" preserve opaquness actually does. |
+DEF_TEST(ColorMatrixFilter, reporter) { |
+ const CFProc procs[] = { |
+ make_cf0, make_cf1, make_cf2, make_cf3, |
+ }; |
+ |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { |
+ SkAutoTUnref<SkColorFilter> cf(procs[i]()); |
+ |
+ // generate all possible r,g,b triples |
+ for (int r = 0; r < 256; ++r) { |
+ for (int g = 0; g < 256; ++g) { |
+ SkPMColor storage[256]; |
+ for (int b = 0; b < 256; ++b) { |
+ storage[b] = SkPackARGB32(0xFF, r, g, b); |
+ } |
+ cf->filterSpan(storage, 256, storage); |
+ for (int b = 0; b < 256; ++b) { |
+ REPORTER_ASSERT(reporter, 0xFF == SkGetPackedA32(storage[b])); |
+ } |
+ } |
+ } |
+ } |
+} |