Index: tests/ColorMatrixTest.cpp |
diff --git a/tests/ColorMatrixTest.cpp b/tests/ColorMatrixTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..885fef9de065dcfaeb267439e56090cd0b584283 |
--- /dev/null |
+++ b/tests/ColorMatrixTest.cpp |
@@ -0,0 +1,95 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkBitmap.h" |
+#include "SkCanvas.h" |
+#include "SkColor.h" |
+#include "SkColorMatrixFilter.h" |
+#include "SkPaint.h" |
+ |
+#include "Test.h" |
+ |
+static inline void assert_color(skiatest::Reporter* reporter, SkColor expected, SkColor actual) { |
+ const int TOLERANCE = 1; |
+ REPORTER_ASSERT(reporter, abs(SkColorGetA(expected) - SkColorGetA(actual)) <= TOLERANCE); |
+ REPORTER_ASSERT(reporter, abs(SkColorGetR(expected) - SkColorGetR(actual)) <= TOLERANCE); |
+ REPORTER_ASSERT(reporter, abs(SkColorGetG(expected) - SkColorGetG(actual)) <= TOLERANCE); |
+ REPORTER_ASSERT(reporter, abs(SkColorGetB(expected) - SkColorGetB(actual)) <= TOLERANCE); |
+} |
+ |
+/** |
+ * This test case is a mirror of the Android CTS tests for MatrixColorFilter |
+ * found in the android.graphics.ColorMatrixColorFilterTest class. |
+ */ |
+static inline void test_colorMatrix(skiatest::Reporter* reporter) { |
scroggo
2015/05/19 20:10:44
Why is this its own function? Why not just use DEF
djsollen
2015/05/19 20:24:29
Personal preference. My intention was that this m
|
+ |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(1,1); |
+ |
+ SkCanvas canvas(bitmap); |
+ SkPaint paint; |
+ |
+ SkScalar blueToCyan[20] = { |
+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, |
+ 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, |
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, |
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }; |
+ paint.setColorFilter(SkColorMatrixFilter::Create(blueToCyan))->unref(); |
+ |
+ paint.setColor(SK_ColorBLUE); |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorCYAN, bitmap.getColor(0, 0)); |
+ |
+ paint.setColor(SK_ColorGREEN); |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorGREEN, bitmap.getColor(0, 0)); |
+ |
+ paint.setColor(SK_ColorRED); |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorRED, bitmap.getColor(0, 0)); |
+ |
+ // color components are clipped, not scaled |
+ paint.setColor(SK_ColorMAGENTA); |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorWHITE, bitmap.getColor(0, 0)); |
+ |
+ SkScalar transparentRedAddBlue[20] = { |
+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, |
+ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, |
+ 0.0f, 0.0f, 1.0f, 0.0f, 64.0f, |
+ -0.5f, 0.0f, 0.0f, 1.0f, 0.0f |
+ }; |
+ paint.setColorFilter(SkColorMatrixFilter::Create(transparentRedAddBlue))->unref(); |
+ bitmap.eraseColor(SK_ColorTRANSPARENT); |
+ |
+ paint.setColor(SK_ColorRED); |
+ canvas.drawPoint(0, 0, paint); |
+ // Temporarily disabled assert until skbug.com/3848 is resolved. |
+ // assert_color(reporter, SkColorSetARGB(128, 255, 0, 64), bitmap.getColor(0, 0)); |
+ |
+ paint.setColor(SK_ColorCYAN); |
+ canvas.drawPoint(0, 0, paint); |
+ // blue gets clipped |
+ assert_color(reporter, SK_ColorCYAN, bitmap.getColor(0, 0)); |
+ |
+ // change array to filter out green |
+ REPORTER_ASSERT(reporter, 1.0f == transparentRedAddBlue[6]); |
+ transparentRedAddBlue[6] = 0.0f; |
+ |
+ // check that changing the array has no effect |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorCYAN, bitmap.getColor(0, 0)); |
+ |
+ // create a new filter with the changed matrix |
+ paint.setColorFilter(SkColorMatrixFilter::Create(transparentRedAddBlue))->unref(); |
+ canvas.drawPoint(0, 0, paint); |
+ assert_color(reporter, SK_ColorBLUE, bitmap.getColor(0, 0)); |
+} |
+ |
+DEF_TEST(ColorMatrix, reporter) { |
+ test_colorMatrix(reporter); |
+} |