blob: 82873ab3729df60748218dd288d25f9b9b7f92bf [file] [log] [blame]
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +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 "SkColor.h"
10#include "SkBitmapSource.h"
11#include "SkBlurImageFilter.h"
12#include "SkDisplacementMapEffect.h"
13#include "SkDropShadowImageFilter.h"
14#include "SkGradientShader.h"
15#include "SkMorphologyImageFilter.h"
16#include "SkOffsetImageFilter.h"
17#include "SkScalar.h"
18
19namespace skiagm {
20
21class ImageFiltersClippedGM : public GM {
22public:
23 ImageFiltersClippedGM() : fInitialized(false) {
24 this->setBGColor(0x00000000);
25 }
26
27protected:
28 virtual SkString onShortName() {
29 return SkString("imagefiltersclipped");
30 }
31
32 virtual SkISize onISize() {
33 return make_isize(860, 500);
34 }
35
36 void make_checkerboard() {
37 fCheckerboard.allocN32Pixels(64, 64);
38 SkBitmapDevice device(fCheckerboard);
39 SkCanvas canvas(&device);
40 canvas.clear(0x00000000);
41 SkPaint darkPaint;
42 darkPaint.setColor(0xFF404040);
43 SkPaint lightPaint;
44 lightPaint.setColor(0xFFA0A0A0);
45 for (int y = 0; y < 64; y += 16) {
46 for (int x = 0; x < 64; x += 16) {
47 canvas.save();
48 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
49 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
50 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
51 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
52 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
53 canvas.restore();
54 }
55 }
56 }
57
58 void make_gradient_circle(int width, int height) {
59 SkScalar x = SkIntToScalar(width / 2);
60 SkScalar y = SkIntToScalar(height / 2);
61 SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5));
62 fGradientCircle.allocN32Pixels(width, height);
63 SkBitmapDevice device(fGradientCircle);
64 SkCanvas canvas(&device);
65 canvas.clear(0x00000000);
66 SkColor colors[2];
67 colors[0] = SK_ColorWHITE;
68 colors[1] = SK_ColorBLACK;
69 SkAutoTUnref<SkShader> shader(
70 SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
71 SkShader::kClamp_TileMode)
72 );
73 SkPaint paint;
74 paint.setShader(shader);
75 canvas.drawCircle(x, y, radius, paint);
76 }
77
78 virtual void onDraw(SkCanvas* canvas) {
79 if (!fInitialized) {
80 this->make_checkerboard();
81 this->make_gradient_circle(64, 64);
82 fInitialized = true;
83 }
84 canvas->clear(0x00000000);
85
86 SkAutoTUnref<SkImageFilter> gradient(new SkBitmapSource(fGradientCircle));
87 SkAutoTUnref<SkImageFilter> checkerboard(new SkBitmapSource(fCheckerboard));
88
89 SkImageFilter* filters[] = {
90 new SkBlurImageFilter(SkIntToScalar(12), SkIntToScalar(12)),
91 new SkDropShadowImageFilter(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3),
92 SK_ColorGREEN),
93 new SkDisplacementMapEffect(SkDisplacementMapEffect::kR_ChannelSelectorType,
94 SkDisplacementMapEffect::kR_ChannelSelectorType,
95 SkIntToScalar(12),
96 gradient.get(),
97 checkerboard.get()),
98 new SkDilateImageFilter(2, 2, checkerboard.get()),
99 new SkErodeImageFilter(2, 2, checkerboard.get()),
100 new SkOffsetImageFilter(SkIntToScalar(-16), SkIntToScalar(32)),
101 };
102
103 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
104 SkScalar margin = SkIntToScalar(16);
105 SkRect bounds = r;
106 bounds.outset(margin, margin);
107
108 for (int xOffset = 0; xOffset < 80; xOffset += 16) {
109 canvas->save();
110 bounds.fLeft = SkIntToScalar(xOffset);
111 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
112 SkPaint paint;
113 paint.setColor(SK_ColorWHITE);
114 paint.setImageFilter(filters[i]);
115 paint.setAntiAlias(true);
116 canvas->save();
117 canvas->clipRect(bounds);
118 if (i == 5) {
119 canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
120 }
121 canvas->drawCircle(r.centerX(), r.centerY(),
122 SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint);
123 canvas->restore();
124 canvas->translate(r.width() + margin, 0);
125 }
126 canvas->restore();
127 canvas->translate(0, r.height() + margin);
128 }
senorblanco@chromium.org67117802014-02-06 00:36:01 +0000129
130 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
131 SkSafeUnref(filters[i]);
132 }
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000133 }
134
135private:
136 bool fInitialized;
137 SkBitmap fCheckerboard;
138 SkBitmap fGradientCircle;
139 typedef GM INHERITED;
140};
141
142//////////////////////////////////////////////////////////////////////////////
143
144static GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
145static GMRegistry reg(MyFactory);
146
147}