Index: tests/ImageFilterTest.cpp |
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
index 4db9196db9bb220f2d0fb5c7e41b965b7d401876..7aefd484816b51e80d9f6a739126cefaa88bf5db 100644 |
--- a/tests/ImageFilterTest.cpp |
+++ b/tests/ImageFilterTest.cpp |
@@ -1706,3 +1706,31 @@ DEF_GPUTEST_FOR_ALL_GL_CONTEXTS(ImageFilterBlurLargeImage_Gpu, reporter, ctxInfo |
test_large_blur_input(reporter, surface->getCanvas()); |
} |
#endif |
+ |
+/* |
+ * Test that colorfilterimagefilter does not require its CTM to be decomposed when it has more |
+ * than just scale/translate, but that other filters do. |
+ */ |
+DEF_TEST(ImageFilterDecomposeCTM, reporter) { |
+ // just need a colorfilter to exercise the corresponding imagefilter |
+ sk_sp<SkColorFilter> cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcATop_Mode); |
+ sk_sp<SkImageFilter> cfif = SkColorFilterImageFilter::Make(cf, nullptr); |
+ sk_sp<SkImageFilter> blif = SkBlurImageFilter::Make(3, 3, nullptr); |
+ |
+ struct { |
+ sk_sp<SkImageFilter> fFilter; |
+ bool fExpectCanHandle; |
+ } recs[] = { |
+ { cfif, true }, |
+ { SkColorFilterImageFilter::Make(cf, cfif), true }, |
+ { SkMergeImageFilter::Make(cfif, cfif), true }, |
+ { blif, false }, |
+ { SkMergeImageFilter::Make(cfif, blif), false }, |
+ { SkColorFilterImageFilter::Make(cf, blif), false }, |
+ }; |
+ |
+ for (const auto& rec : recs) { |
+ const bool canHandle = rec.fFilter->canHandleAffine(); |
+ REPORTER_ASSERT(reporter, canHandle == rec.fExpectCanHandle); |
+ } |
+} |