1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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/SkPaint.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
drawOne(SkCanvas * canvas,SkRect rect,float saveBorder,float sigma,SkColor c)14*c8dee2aaSAndroid Build Coastguard Worker static void drawOne(SkCanvas* canvas, SkRect rect, float saveBorder, float sigma, SkColor c) {
15*c8dee2aaSAndroid Build Coastguard Worker SkRect borderRect = rect.makeOutset(saveBorder, saveBorder);
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
18*c8dee2aaSAndroid Build Coastguard Worker p.setColor(c);
19*c8dee2aaSAndroid Build Coastguard Worker p.setImageFilter(
20*c8dee2aaSAndroid Build Coastguard Worker SkImageFilters::Blur(sigma, sigma,
21*c8dee2aaSAndroid Build Coastguard Worker // The blur's input is forced to have transparent padding because 'borderRect' is outset
22*c8dee2aaSAndroid Build Coastguard Worker // from the non-transparent content ('rect') that's drawn into the layer.
23*c8dee2aaSAndroid Build Coastguard Worker SkImageFilters::Crop(borderRect, SkTileMode::kClamp, nullptr),
24*c8dee2aaSAndroid Build Coastguard Worker // The blur's output crop visually won't affect the output because the transparent
25*c8dee2aaSAndroid Build Coastguard Worker // padding is blurred out by the edge of 3*sigma.
26*c8dee2aaSAndroid Build Coastguard Worker borderRect.makeOutset(3 * sigma, 3 * sigma)));
27*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, p);
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(crbug_1156804, canvas, 250, 250) {
33*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, SkRect::MakeXYWH( 64, 64, 25, 25), 1, 3, SK_ColorGREEN);
34*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, SkRect::MakeXYWH(164, 64, 25, 25), 30, 3, SK_ColorGREEN);
35*c8dee2aaSAndroid Build Coastguard Worker // This one would draw incorrectly because the large sigma causes downscaling of the source
36*c8dee2aaSAndroid Build Coastguard Worker // and the one-pixel border would make the downscaled image not contain trans-black at the
37*c8dee2aaSAndroid Build Coastguard Worker // edges. Combined with the clamp mode on the blur filter it would "harden" the edge.
38*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, SkRect::MakeXYWH( 64, 164, 25, 25), 1, 20, SK_ColorRED);
39*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, SkRect::MakeXYWH(164, 164, 25, 25), 30, 20, SK_ColorGREEN);
40*c8dee2aaSAndroid Build Coastguard Worker }
41