blob: 2e452ee577cb9bac935f001e19d262e91f602eb8 [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"
22#include "SkMergeImageFilter.h"
23#include "SkOffsetImageFilter.h"
fmalita5598b632015-09-15 11:26:13 -070024#include "SkSurface.h"
senorblanco@chromium.org11825292014-03-14 17:44:41 +000025
26///////////////////////////////////////////////////////////////////////////////
27
28class ImageFiltersCropExpandGM : public skiagm::GM {
29public:
30 ImageFiltersCropExpandGM () {}
31
32protected:
33
fmalita5598b632015-09-15 11:26:13 -070034 SkString onShortName() override {
senorblanco@chromium.org11825292014-03-14 17:44:41 +000035 return SkString("imagefilterscropexpand");
36 }
37
fmalita5598b632015-09-15 11:26:13 -070038 SkISize onISize() override { return SkISize::Make(570, 650); }
senorblanco@chromium.org11825292014-03-14 17:44:41 +000039
fmalita5598b632015-09-15 11:26:13 -070040 void onDraw(SkCanvas* canvas) override {
41 SkAutoTUnref<SkColorFilter> cf(
42 SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
43 SkImageFilter::CropRect cropRect(
44 SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
45 SkImageFilter::CropRect::kHasAll_CropEdge);
46
47 SkAutoTUnref<SkImage> gradientCircle(MakeGradientCircle(64, 64));
48 SkBitmap checkerboard;
49 MakeCheckerboard(&checkerboard);
50
51 SkAutoTUnref<SkImageFilter> gradientCircleSource(
52 SkImageSource::Create(gradientCircle));
53 SkAutoTUnref<SkImageFilter> noopCropped(
54 SkOffsetImageFilter::Create(0, 0, nullptr, &cropRect));
55 SkScalar sk255 = SkIntToScalar(255);
56 SkScalar matrix[20] = { 1, 0, 0, 0, 0,
57 0, 1, 0, 0, sk255,
58 0, 0, 1, 0, 0,
59 0, 0, 0, 0, sk255 };
60 SkAutoTUnref<SkColorFilter> cfAlphaTrans(SkColorMatrixFilter::Create(matrix));
61
62 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
63 SkScalar MARGIN = SkIntToScalar(12);
64
65 SkIRect bounds;
66 r.roundOut(&bounds);
67
68 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 big_rect(rect, SkImageFilter::CropRect::kHasAll_CropEdge);
76
77 Draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Create(
78 cfAlphaTrans, noopCropped.get(), &big_rect));
79
80 Draw(canvas, checkerboard, rect, SkBlurImageFilter::Create(
81 8.0f, 8.0f, noopCropped.get(), &big_rect));
82
83 Draw(canvas, checkerboard, rect, SkDilateImageFilter::Create(
84 2, 2, noopCropped.get(), &big_rect));
85
86 Draw(canvas, checkerboard, rect, SkErodeImageFilter::Create(
87 2, 2, noopCropped.get(), &big_rect));
88
89 Draw(canvas, checkerboard, rect, SkDropShadowImageFilter::Create(
90 SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), SkIntToScalar(3),
91 SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
92 noopCropped.get(), &big_rect));
93
94 Draw(canvas, checkerboard, rect, SkDisplacementMapEffect::Create(
95 SkDisplacementMapEffect::kR_ChannelSelectorType,
96 SkDisplacementMapEffect::kR_ChannelSelectorType,
97 SkIntToScalar(12),
98 gradientCircleSource.get(),
99 noopCropped.get(),
100 &big_rect));
101
102 Draw(canvas, checkerboard, rect, SkOffsetImageFilter::Create(
103 SkIntToScalar(-8), SkIntToScalar(16), noopCropped.get(), &big_rect));
104
105 canvas->restore();
106 canvas->translate(0, SkIntToScalar(80));
107 }
108 }
109
110private:
111 static void MakeCheckerboard(SkBitmap* bitmap) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000112 bitmap->allocN32Pixels(64, 64);
113 SkCanvas canvas(*bitmap);
114 canvas.clear(0xFFFF0000);
115 SkPaint darkPaint;
caryclark12596012015-07-29 05:27:47 -0700116 darkPaint.setColor(sk_tool_utils::color_to_565(0xFF404040));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000117 SkPaint lightPaint;
caryclark12596012015-07-29 05:27:47 -0700118 lightPaint.setColor(sk_tool_utils::color_to_565(0xFFA0A0A0));
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000119 for (int y = 8; y < 48; y += 16) {
120 for (int x = 8; x < 48; x += 16) {
121 canvas.save();
122 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
123 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
124 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
125 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
126 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
127 canvas.restore();
128 }
129 }
130 }
131
fmalita5598b632015-09-15 11:26:13 -0700132 static SkImage* MakeGradientCircle(int width, int height) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000133 SkScalar x = SkIntToScalar(width / 2);
134 SkScalar y = SkIntToScalar(height / 2);
135 SkScalar radius = SkMinScalar(x, y) * 0.8f;
fmalita5598b632015-09-15 11:26:13 -0700136 SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(width, height));
137 SkCanvas* canvas = surface->getCanvas();
138 canvas->clear(0x00000000);
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000139 SkColor colors[2];
140 colors[0] = SK_ColorWHITE;
141 colors[1] = SK_ColorBLACK;
142 SkAutoTUnref<SkShader> shader(
halcanary96fcdcc2015-08-27 07:41:13 -0700143 SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, nullptr, 2,
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000144 SkShader::kClamp_TileMode)
145 );
146 SkPaint paint;
147 paint.setShader(shader);
fmalita5598b632015-09-15 11:26:13 -0700148 canvas->drawCircle(x, y, radius, paint);
149
150 return surface->newImageSnapshot();
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000151 }
152
fmalita5598b632015-09-15 11:26:13 -0700153 static void Draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, SkImageFilter* filter) {
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000154 SkPaint paint;
155 paint.setImageFilter(filter)->unref();
156 canvas->saveLayer(&rect, &paint);
157 canvas->drawBitmap(bitmap, 0, 0);
158 canvas->restore();
skia.committer@gmail.comf0f9f5f2014-03-15 03:02:32 +0000159
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000160 SkPaint strokePaint;
161 strokePaint.setColor(0xFFFF0000);
162 strokePaint.setStyle(SkPaint::kStroke_Style);
163 canvas->drawRect(rect, strokePaint);
164
165 canvas->translate(SkIntToScalar(80), 0);
166 }
167
senorblanco@chromium.org11825292014-03-14 17:44:41 +0000168 typedef GM INHERITED;
169};
170
171///////////////////////////////////////////////////////////////////////////////
172
173static skiagm::GM* MyFactory(void*) { return new ImageFiltersCropExpandGM; }
174static skiagm::GMRegistry reg(MyFactory);