blob: 9b9f7ee81743e91dd8e6a434ac2103902a85478c [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
28///////////////////////////////////////////////////////////////////////////////
29
30class ImageFiltersCropExpandGM : public skiagm::GM {
31public:
32 ImageFiltersCropExpandGM () {}
33
34protected:
35
fmalita5598b632015-09-15 11:26:13 -070036 SkString onShortName() override {
senorblanco@chromium.org11825292014-03-14 17:44:41 +000037 return SkString("imagefilterscropexpand");
38 }
39
senorblanco84f0e742016-02-16 13:26:56 -080040 SkISize onISize() override { return SkISize::Make(730, 650); }
senorblanco@chromium.org11825292014-03-14 17:44:41 +000041
fmalita5598b632015-09-15 11:26:13 -070042 void onDraw(SkCanvas* canvas) override {
fmalita5598b632015-09-15 11:26:13 -070043 SkImageFilter::CropRect cropRect(
44 SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
45 SkImageFilter::CropRect::kHasAll_CropEdge);
46
reed9ce9d672016-03-17 10:51:11 -070047 sk_sp<SkImage> gradientCircle(MakeGradientCircle(64, 64));
fmalita5598b632015-09-15 11:26:13 -070048 SkBitmap checkerboard;
49 MakeCheckerboard(&checkerboard);
50
robertphillips549c8992016-04-01 09:28:51 -070051 sk_sp<SkImageFilter> gradientCircleSource(SkImageSource::Make(std::move(gradientCircle)));
robertphillips51a315e2016-03-31 09:05:49 -070052 sk_sp<SkImageFilter> noopCropped(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect));
senorblanco39499712016-05-18 07:00:08 -070053 // This color matrix saturates the green component but only partly increases the opacity.
54 // For the opaque checkerboard, the opacity boost doesn't matter but it does impact the
55 // area outside the checkerboard.
fmalita5598b632015-09-15 11:26:13 -070056 SkScalar matrix[20] = { 1, 0, 0, 0, 0,
senorblanco39499712016-05-18 07:00:08 -070057 0, 1, 0, 0, 255,
fmalita5598b632015-09-15 11:26:13 -070058 0, 0, 1, 0, 0,
senorblanco39499712016-05-18 07:00:08 -070059 0, 0, 0, 1, 32 };
robertphillips12fa47d2016-04-08 16:28:09 -070060 sk_sp<SkColorFilter> cfAlphaTrans(SkColorFilter::MakeMatrixFilterRowMajor255(matrix));
fmalita5598b632015-09-15 11:26:13 -070061
62 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
63 SkScalar MARGIN = SkIntToScalar(12);
64
senorblanco84f0e742016-02-16 13:26:56 -080065 SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
66 SkScalar kd = SkIntToScalar(2);
67 SkScalar surfaceScale = SkIntToScalar(1);
fmalita5598b632015-09-15 11:26:13 -070068 SkIRect bounds;
69 r.roundOut(&bounds);
70
71 SkPaint paint;
72 canvas->translate(MARGIN, MARGIN);
73 for (int outset = -15; outset <= 20; outset += 5) {
74 canvas->save();
75 SkRect rect = cropRect.rect();
76 rect.outset(SkIntToScalar(outset),
77 SkIntToScalar(outset));
senorblanco84f0e742016-02-16 13:26:56 -080078 SkImageFilter::CropRect bigRect(rect, SkImageFilter::CropRect::kHasAll_CropEdge);
fmalita5598b632015-09-15 11:26:13 -070079
robertphillips5605b562016-04-05 11:50:42 -070080 Draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Make(cfAlphaTrans,
81 noopCropped,
82 &bigRect));
senorblanco84f0e742016-02-16 13:26:56 -080083
robertphillips6e7025a2016-04-04 04:31:25 -070084 Draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(0.3f, 0.3f,
85 noopCropped,
86 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -070087
robertphillips6e7025a2016-04-04 04:31:25 -070088 Draw(canvas, checkerboard, rect, SkBlurImageFilter::Make(8.0f, 8.0f,
89 noopCropped,
90 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -070091
robertphillipsfc11b0a2016-04-05 09:09:36 -070092 Draw(canvas, checkerboard, rect, SkDilateImageFilter::Make(2, 2,
93 noopCropped,
94 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -070095
robertphillipsfc11b0a2016-04-05 09:09:36 -070096 Draw(canvas, checkerboard, rect, SkErodeImageFilter::Make(2, 2,
97 noopCropped,
98 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -070099
100 Draw(canvas, checkerboard, rect,
robertphillipsc4169122016-04-06 08:40:59 -0700101 SkDropShadowImageFilter::Make(
robertphillips51a315e2016-03-31 09:05:49 -0700102 SkIntToScalar(10),
103 SkIntToScalar(10),
104 SkIntToScalar(3),
105 SkIntToScalar(3),
106 SK_ColorBLUE,
107 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
robertphillipsc4169122016-04-06 08:40:59 -0700108 noopCropped,
109 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -0700110
111 Draw(canvas, checkerboard, rect,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700112 SkDisplacementMapEffect::Make(SkDisplacementMapEffect::kR_ChannelSelectorType,
113 SkDisplacementMapEffect::kR_ChannelSelectorType,
114 SkIntToScalar(12),
115 gradientCircleSource,
116 noopCropped,
117 &bigRect));
robertphillips51a315e2016-03-31 09:05:49 -0700118
119 Draw(canvas, checkerboard, rect,
120 SkOffsetImageFilter::Make(SkIntToScalar(-8), SkIntToScalar(16),
121 noopCropped,
122 &bigRect));
123
124 Draw(canvas, checkerboard, rect,
robertphillips12fa47d2016-04-08 16:28:09 -0700125 SkLightingImageFilter::MakePointLitDiffuse(pointLocation,
126 SK_ColorWHITE,
127 surfaceScale,
128 kd,
129 noopCropped,
130 &bigRect));
fmalita5598b632015-09-15 11:26:13 -0700131
132 canvas->restore();
133 canvas->translate(0, SkIntToScalar(80));
134 }
135 }
136
137private:
138 static void MakeCheckerboard(SkBitmap* bitmap) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000139 bitmap->allocN32Pixels(64, 64);
140 SkCanvas canvas(*bitmap);
141 canvas.clear(0xFFFF0000);
142 SkPaint darkPaint;
caryclark12596012015-07-29 05:27:47 -0700143 darkPaint.setColor(sk_tool_utils::color_to_565(0xFF404040));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000144 SkPaint lightPaint;
caryclark12596012015-07-29 05:27:47 -0700145 lightPaint.setColor(sk_tool_utils::color_to_565(0xFFA0A0A0));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000146 for (int y = 8; y < 48; y += 16) {
147 for (int x = 8; x < 48; x += 16) {
148 canvas.save();
149 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
150 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
151 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
152 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
153 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
154 canvas.restore();
155 }
156 }
157 }
158
reed9ce9d672016-03-17 10:51:11 -0700159 static sk_sp<SkImage> MakeGradientCircle(int width, int height) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000160 SkScalar x = SkIntToScalar(width / 2);
161 SkScalar y = SkIntToScalar(height / 2);
162 SkScalar radius = SkMinScalar(x, y) * 0.8f;
reede8f30622016-03-23 18:59:25 -0700163 auto surface(SkSurface::MakeRasterN32Premul(width, height));
fmalita5598b632015-09-15 11:26:13 -0700164 SkCanvas* canvas = surface->getCanvas();
165 canvas->clear(0x00000000);
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000166 SkColor colors[2];
167 colors[0] = SK_ColorWHITE;
168 colors[1] = SK_ColorBLACK;
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000169 SkPaint paint;
reed1a9b9642016-03-13 14:13:58 -0700170 paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr,
171 2, SkShader::kClamp_TileMode));
fmalita5598b632015-09-15 11:26:13 -0700172 canvas->drawCircle(x, y, radius, paint);
173
reed9ce9d672016-03-17 10:51:11 -0700174 return surface->makeImageSnapshot();
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000175 }
176
robertphillips51a315e2016-03-31 09:05:49 -0700177 static void Draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect,
178 sk_sp<SkImageFilter> filter) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000179 SkPaint paint;
robertphillips51a315e2016-03-31 09:05:49 -0700180 paint.setImageFilter(std::move(filter));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000181 canvas->saveLayer(&rect, &paint);
182 canvas->drawBitmap(bitmap, 0, 0);
183 canvas->restore();
skia.committer@gmail.comf0f9f5f2014-03-15 03:02:32 +0000184
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000185 SkPaint strokePaint;
186 strokePaint.setColor(0xFFFF0000);
187 strokePaint.setStyle(SkPaint::kStroke_Style);
188 canvas->drawRect(rect, strokePaint);
189
190 canvas->translate(SkIntToScalar(80), 0);
191 }
192
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000193 typedef GM INHERITED;
194};
195
196///////////////////////////////////////////////////////////////////////////////
197
scroggo96f16e82015-12-10 13:31:59 -0800198DEF_GM( return new ImageFiltersCropExpandGM; )