xref: /aosp_15_r20/external/skia/gm/crbug_1313579.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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