blob: 57ff14b4a0e9ca21982c1f073d45cf9048dd306c [file] [log] [blame]
senorblanco@chromium.org11825292014-03-14 17:44:41 +00001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "SkCanvas.h"
10#include "SkColorFilter.h"
11#include "SkColorPriv.h"
12#include "SkShader.h"
13
senorblanco@chromium.org11825292014-03-14 17:44:41 +000014#include "SkBlurImageFilter.h"
15#include "SkColorMatrixFilter.h"
16#include "SkDisplacementMapEffect.h"
17#include "SkDropShadowImageFilter.h"
18#include "SkGradientShader.h"
fmalita5598b632015-09-15 11:26:13 -070019#include "SkImageSource.h"
senorblanco@chromium.org11825292014-03-14 17:44:41 +000020#include "SkMorphologyImageFilter.h"
21#include "SkColorFilterImageFilter.h"
senorblanco84f0e742016-02-16 13:26:56 -080022#include "SkLightingImageFilter.h"
senorblanco@chromium.org11825292014-03-14 17:44:41 +000023#include "SkMergeImageFilter.h"
24#include "SkOffsetImageFilter.h"
senorblanco84f0e742016-02-16 13:26:56 -080025#include "SkPoint3.h"
fmalita5598b632015-09-15 11:26:13 -070026#include "SkSurface.h"
senorblanco@chromium.org11825292014-03-14 17:44:41 +000027
Stephen White930f69e2017-01-12 17:15:50 -050028namespace {
29
30void make_checkerboard(SkBitmap* bitmap);
31sk_sp<SkImage> make_gradient_circle(int width, int height);
32void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect,
33 sk_sp<SkImageFilter> filter);
34
35};
36
senorblanco@chromium.org11825292014-03-14 17:44:41 +000037///////////////////////////////////////////////////////////////////////////////
38
Stephen White930f69e2017-01-12 17:15:50 -050039DEF_SIMPLE_GM(imagefilterscropexpand, canvas, 730, 650) {
40 SkImageFilter::CropRect cropRect(
41 SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
42 SkImageFilter::CropRect::kHasAll_CropEdge);
senorblanco@chromium.org11825292014-03-14 17:44:41 +000043
Stephen White930f69e2017-01-12 17:15:50 -050044 sk_sp<SkImage> gradientCircle(make_gradient_circle(64, 64));
45 SkBitmap checkerboard;
46 make_checkerboard(&checkerboard);
senorblanco@chromium.org11825292014-03-14 17:44:41 +000047
Stephen White930f69e2017-01-12 17:15:50 -050048 sk_sp<SkImageFilter> gradientCircleSource(SkImageSource::Make(std::move(gradientCircle)));
49 sk_sp<SkImageFilter> noopCropped(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect));
50 // This color matrix saturates the green component but only partly increases the opacity.
51 // For the opaque checkerboard, the opacity boost doesn't matter but it does impact the
52 // area outside the checkerboard.
53 SkScalar matrix[20] = { 1, 0, 0, 0, 0,
54 0, 1, 0, 0, 255,
55 0, 0, 1, 0, 0,
56 0, 0, 0, 1, 32 };
57 sk_sp<SkColorFilter> cfAlphaTrans(SkColorFilter::MakeMatrixFilterRowMajor255(matrix));
senorblanco@chromium.org11825292014-03-14 17:44:41 +000058
Stephen White930f69e2017-01-12 17:15:50 -050059 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
60 SkScalar MARGIN = SkIntToScalar(12);
senorblanco@chromium.org11825292014-03-14 17:44:41 +000061
Stephen White930f69e2017-01-12 17:15:50 -050062 SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
63 SkScalar kd = SkIntToScalar(2);
64 SkScalar surfaceScale = SkIntToScalar(1);
65 SkIRect bounds;
66 r.roundOut(&bounds);
fmalita5598b632015-09-15 11:26:13 -070067
Stephen White930f69e2017-01-12 17:15:50 -050068 SkPaint paint;
69 canvas->translate(MARGIN, MARGIN);
70 for (int outset = -15; outset <= 20; outset += 5) {
71 canvas->save();
72 SkRect rect = cropRect.rect();
73 rect.outset(SkIntToScalar(outset),
74 SkIntToScalar(outset));
75 SkImageFilter::CropRect bigRect(rect, SkImageFilter::CropRect::kHasAll_CropEdge);
fmalita5598b632015-09-15 11:26:13 -070076
Stephen White930f69e2017-01-12 17:15:50 -050077 draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Make(cfAlphaTrans,
78 noopCropped,
79 &bigRect));
fmalita5598b632015-09-15 11:26:13 -070080
Stephen White930f69e2017-01-12 17:15:50 -050081 draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(0.3f, 0.3f,
82 noopCropped,
83 &bigRect));
fmalita5598b632015-09-15 11:26:13 -070084
Stephen White930f69e2017-01-12 17:15:50 -050085 draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(8.0f, 8.0f,
86 noopCropped,
87 &bigRect));
fmalita5598b632015-09-15 11:26:13 -070088
Stephen White930f69e2017-01-12 17:15:50 -050089 draw(canvas, checkerboard, rect, SkDilateImageFilter::Make(2, 2,
90 noopCropped,
91 &bigRect));
fmalita5598b632015-09-15 11:26:13 -070092
Stephen White930f69e2017-01-12 17:15:50 -050093 draw(canvas, checkerboard, rect, SkErodeImageFilter::Make(2, 2,
94 noopCropped,
95 &bigRect));
senorblanco84f0e742016-02-16 13:26:56 -080096
Stephen White930f69e2017-01-12 17:15:50 -050097 draw(canvas, checkerboard, rect,
98 SkDropShadowImageFilter::Make(
99 SkIntToScalar(10),
100 SkIntToScalar(10),
101 SkIntToScalar(3),
102 SkIntToScalar(3),
103 SK_ColorBLUE,
104 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
105 noopCropped,
106 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -0700107
Stephen White930f69e2017-01-12 17:15:50 -0500108 draw(canvas, checkerboard, rect,
109 SkDisplacementMapEffect::Make(SkDisplacementMapEffect::kR_ChannelSelectorType,
110 SkDisplacementMapEffect::kR_ChannelSelectorType,
111 SkIntToScalar(12),
112 gradientCircleSource,
robertphillips51a315e2016-03-31 09:05:49 -0700113 noopCropped,
114 &bigRect));
115
Stephen White930f69e2017-01-12 17:15:50 -0500116 draw(canvas, checkerboard, rect,
117 SkOffsetImageFilter::Make(SkIntToScalar(-8), SkIntToScalar(16),
118 noopCropped,
119 &bigRect));
fmalita5598b632015-09-15 11:26:13 -0700120
Stephen White930f69e2017-01-12 17:15:50 -0500121 draw(canvas, checkerboard, rect,
122 SkLightingImageFilter::MakePointLitDiffuse(pointLocation,
123 SK_ColorWHITE,
124 surfaceScale,
125 kd,
126 noopCropped,
127 &bigRect));
128
129 canvas->restore();
130 canvas->translate(0, SkIntToScalar(80));
fmalita5598b632015-09-15 11:26:13 -0700131 }
Stephen White930f69e2017-01-12 17:15:50 -0500132}
fmalita5598b632015-09-15 11:26:13 -0700133
Stephen White930f69e2017-01-12 17:15:50 -0500134namespace {
135 void make_checkerboard(SkBitmap* bitmap) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000136 bitmap->allocN32Pixels(64, 64);
137 SkCanvas canvas(*bitmap);
138 canvas.clear(0xFFFF0000);
139 SkPaint darkPaint;
caryclark12596012015-07-29 05:27:47 -0700140 darkPaint.setColor(sk_tool_utils::color_to_565(0xFF404040));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000141 SkPaint lightPaint;
caryclark12596012015-07-29 05:27:47 -0700142 lightPaint.setColor(sk_tool_utils::color_to_565(0xFFA0A0A0));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000143 for (int y = 8; y < 48; y += 16) {
144 for (int x = 8; x < 48; x += 16) {
145 canvas.save();
146 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
147 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
148 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
149 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
150 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
151 canvas.restore();
152 }
153 }
154 }
155
Stephen White930f69e2017-01-12 17:15:50 -0500156 sk_sp<SkImage> make_gradient_circle(int width, int height) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000157 SkScalar x = SkIntToScalar(width / 2);
158 SkScalar y = SkIntToScalar(height / 2);
159 SkScalar radius = SkMinScalar(x, y) * 0.8f;
reede8f30622016-03-23 18:59:25 -0700160 auto surface(SkSurface::MakeRasterN32Premul(width, height));
fmalita5598b632015-09-15 11:26:13 -0700161 SkCanvas* canvas = surface->getCanvas();
162 canvas->clear(0x00000000);
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000163 SkColor colors[2];
164 colors[0] = SK_ColorWHITE;
165 colors[1] = SK_ColorBLACK;
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000166 SkPaint paint;
reed1a9b9642016-03-13 14:13:58 -0700167 paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr,
168 2, SkShader::kClamp_TileMode));
fmalita5598b632015-09-15 11:26:13 -0700169 canvas->drawCircle(x, y, radius, paint);
170
reed9ce9d672016-03-17 10:51:11 -0700171 return surface->makeImageSnapshot();
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000172 }
173
Stephen White930f69e2017-01-12 17:15:50 -0500174 void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect,
robertphillips51a315e2016-03-31 09:05:49 -0700175 sk_sp<SkImageFilter> filter) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000176 SkPaint paint;
robertphillips51a315e2016-03-31 09:05:49 -0700177 paint.setImageFilter(std::move(filter));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000178 canvas->saveLayer(&rect, &paint);
179 canvas->drawBitmap(bitmap, 0, 0);
180 canvas->restore();
skia.committer@gmail.comf0f9f5f2014-03-15 03:02:32 +0000181
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000182 SkPaint strokePaint;
183 strokePaint.setColor(0xFFFF0000);
184 strokePaint.setStyle(SkPaint::kStroke_Style);
185 canvas->drawRect(rect, strokePaint);
186
187 canvas->translate(SkIntToScalar(80), 0);
188 }
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000189};