Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Unified Diff: tests/ImageFilterTest.cpp

Issue 1844593002: Fix failed filter followed by an affects-transparent-black filter. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix formatting Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/ImageFilterTest.cpp
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 89f5061f537939b27ac22164baabdac1bb04a686..f9a513e6e1054fad945eb3df29592f106f2510b2 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -79,6 +79,36 @@ private:
typedef SkImageFilter INHERITED;
};
+class FailImageFilter : public SkImageFilter {
+public:
+ FailImageFilter() : SkImageFilter(0, nullptr) {
+ }
+
+ sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source,
+ const Context& ctx,
+ SkIPoint* offset) const override {
+ return nullptr;
+ }
+
+ SK_TO_STRING_OVERRIDE()
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
+
+private:
+ typedef SkImageFilter INHERITED;
+};
+
+SkFlattenable* FailImageFilter::CreateProc(SkReadBuffer& buffer) {
+ SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
+ return new FailImageFilter();
+}
+
+#ifndef SK_IGNORE_TO_STRING
+void FailImageFilter::toString(SkString* str) const {
+ str->appendf("FailImageFilter: (");
+ str->append(")");
+}
+#endif
+
void draw_gradient_circle(SkCanvas* canvas, int width, int height) {
SkScalar x = SkIntToScalar(width / 2);
SkScalar y = SkIntToScalar(height / 2);
@@ -635,6 +665,39 @@ DEF_GPUTEST_FOR_NATIVE_CONTEXT(TestZeroBlurSigma_Gpu, reporter, context) {
}
#endif
+
+// Tests that, even when an upstream filter has returned null (due to failure or clipping), a
+// downstream filter that affects transparent black still does so even with a nullptr input.
+static void test_fail_affects_transparent_black(SkImageFilter::Proxy* proxy,
+ skiatest::Reporter* reporter,
+ GrContext* context) {
+ sk_sp<FailImageFilter> failFilter(new FailImageFilter());
+ sk_sp<SkSpecialImage> source(create_empty_special_image(context, proxy, 5));
+ SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 1, 1), nullptr);
+ sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXfermode::kSrc_Mode));
robertphillips 2016/03/30 17:12:28 SkASSERT(green->affectsTransparentBlack());
Stephen White 2016/04/04 21:50:55 Done.
+ sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Create(green.get(),
+ failFilter.get()));
+ SkIPoint offset;
+ sk_sp<SkSpecialImage> result(greenFilter->filterImage(source.get(), ctx, &offset));
+ REPORTER_ASSERT(reporter, nullptr != result.get());
+ if (result.get()) {
+ SkBitmap resultBM;
+ TestingSpecialImageAccess::GetROPixels(result.get(), &resultBM);
+ SkAutoLockPixels lock(resultBM);
+ REPORTER_ASSERT(reporter, *resultBM.getAddr32(0, 0) == SK_ColorGREEN);
+ }
+}
+
+DEF_TEST(ImageFilterFailAffectsTransparentBlack, reporter) {
+ run_raster_test(reporter, 100, test_fail_affects_transparent_black);
+}
+
+#if SK_SUPPORT_GPU
+DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterFailAffectsTransparentBlack_Gpu, reporter, context) {
+ run_gpu_test(reporter, context, 100, test_fail_affects_transparent_black);
+}
+#endif
+
DEF_TEST(ImageFilterDrawTiled, reporter) {
// Check that all filters when drawn tiled (with subsequent clip rects) exactly
// match the same filters drawn with a single full-canvas bitmap draw.
« src/effects/SkColorFilterImageFilter.cpp ('K') | « src/effects/SkColorFilterImageFilter.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698