1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkImageFilters.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker // SkiaRenderer can wind up specifying near-integer scale-and-translate matrices on SkCanvas before 15*c8dee2aaSAndroid Build Coastguard Worker // applying a backdrop blur image filter via saveLayer() with an integer clip, crop rect, and 16*c8dee2aaSAndroid Build Coastguard Worker // SaveLayerRec bounds. Round-out is used to determine the bounds of the input image needed in IFs. 17*c8dee2aaSAndroid Build Coastguard Worker // This could cause an extra row/column of pixels to be included in the blur. When that row/column 18*c8dee2aaSAndroid Build Coastguard Worker // is significantly different in color than the intended blur content and the radius is large then 19*c8dee2aaSAndroid Build Coastguard Worker // clamp mode blur creates a very noticeable color bleed artifact. 20*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(crbug_1313579, canvas, 110, 110) { 21*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kBGRect = SkIRect{0, 0, 100, 100}; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImageFilter> backdrop_filter = 24*c8dee2aaSAndroid Build Coastguard Worker SkImageFilters::Blur(50.f, 50.f, SkTileMode::kClamp, nullptr, kBGRect); 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorGREEN); 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker m.setAll(0.999999f, 0, 4.99999f, 31*c8dee2aaSAndroid Build Coastguard Worker 0, 0.999999f, 4.99999f, 32*c8dee2aaSAndroid Build Coastguard Worker 0, 0, 1); 33*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(m); 34*c8dee2aaSAndroid Build Coastguard Worker canvas->clipIRect(kBGRect); 35*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorWHITE); 36*c8dee2aaSAndroid Build Coastguard Worker canvas->saveLayer(SkCanvas::SaveLayerRec(nullptr, nullptr, backdrop_filter.get(), 0)); 37*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 38*c8dee2aaSAndroid Build Coastguard Worker } 39