1 /*
2 * Copyright 2013 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 "SkBitmapSource.h"
9 #include "SkDisplacementMapEffect.h"
10 #include "gm.h"
11 #include "sk_tool_utils.h"
12
13 namespace skiagm {
14
15 class DisplacementMapGM : public GM {
16 public:
DisplacementMapGM()17 DisplacementMapGM() : fInitialized(false) {
18 this->setBGColor(0xFF000000);
19 }
20
21 protected:
onShortName()22 virtual SkString onShortName() {
23 return SkString("displacement");
24 }
25
make_bitmaps()26 void make_bitmaps() {
27 make_bitmap();
28 make_checkerboard(&fCheckerboard, 80, 80);
29 make_checkerboard(&fSmall, 64, 64);
30 make_checkerboard(&fLarge, 96, 96);
31 make_checkerboard(&fLargeW, 96, 64);
32 make_checkerboard(&fLargeH, 64, 96);
33 }
34
make_bitmap()35 void make_bitmap() {
36 fBitmap.allocN32Pixels(80, 80);
37 SkCanvas canvas(fBitmap);
38 canvas.clear(0x00000000);
39 SkPaint paint;
40 paint.setAntiAlias(true);
41 sk_tool_utils::set_portable_typeface(&paint);
42 paint.setColor(0xFF884422);
43 paint.setTextSize(SkIntToScalar(96));
44 const char* str = "g";
45 canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(55), paint);
46 }
47
make_checkerboard(SkBitmap * bitmap,int w,int h)48 void make_checkerboard(SkBitmap* bitmap, int w, int h) {
49 bitmap->allocN32Pixels(w, h);
50 SkCanvas canvas(*bitmap);
51 sk_tool_utils::draw_checkerboard(&canvas, 0xFF244484, 0xFF804020, 8);
52 }
53
onISize()54 virtual SkISize onISize() {
55 return SkISize::Make(500, 500);
56 }
57
drawClippedBitmap(SkCanvas * canvas,int x,int y,const SkPaint & paint)58 void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
59 canvas->save();
60 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
61 canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
62 canvas->drawBitmap(fBitmap, 0, 0, &paint);
63 canvas->restore();
64 }
65
onDraw(SkCanvas * canvas)66 virtual void onDraw(SkCanvas* canvas) {
67 if (!fInitialized) {
68 make_bitmaps();
69 fInitialized = true;
70 }
71 canvas->clear(SK_ColorBLACK);
72 SkPaint paint;
73 SkAutoTUnref<SkImageFilter> displ(SkBitmapSource::Create(fCheckerboard));
74 paint.setImageFilter(SkDisplacementMapEffect::Create(
75 SkDisplacementMapEffect::kR_ChannelSelectorType,
76 SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ))->unref();
77 drawClippedBitmap(canvas, 0, 0, paint);
78 paint.setImageFilter(SkDisplacementMapEffect::Create(
79 SkDisplacementMapEffect::kB_ChannelSelectorType,
80 SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ))->unref();
81 drawClippedBitmap(canvas, 100, 0, paint);
82 paint.setImageFilter(SkDisplacementMapEffect::Create(
83 SkDisplacementMapEffect::kR_ChannelSelectorType,
84 SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ))->unref();
85 drawClippedBitmap(canvas, 200, 0, paint);
86 paint.setImageFilter(SkDisplacementMapEffect::Create(
87 SkDisplacementMapEffect::kG_ChannelSelectorType,
88 SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ))->unref();
89 drawClippedBitmap(canvas, 300, 0, paint);
90 paint.setImageFilter(SkDisplacementMapEffect::Create(
91 SkDisplacementMapEffect::kR_ChannelSelectorType,
92 SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ))->unref();
93 drawClippedBitmap(canvas, 400, 0, paint);
94
95 paint.setImageFilter(SkDisplacementMapEffect::Create(
96 SkDisplacementMapEffect::kR_ChannelSelectorType,
97 SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref();
98 drawClippedBitmap(canvas, 0, 100, paint);
99 paint.setImageFilter(SkDisplacementMapEffect::Create(
100 SkDisplacementMapEffect::kB_ChannelSelectorType,
101 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
102 drawClippedBitmap(canvas, 100, 100, paint);
103 paint.setImageFilter(SkDisplacementMapEffect::Create(
104 SkDisplacementMapEffect::kR_ChannelSelectorType,
105 SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref();
106 drawClippedBitmap(canvas, 200, 100, paint);
107 paint.setImageFilter(SkDisplacementMapEffect::Create(
108 SkDisplacementMapEffect::kG_ChannelSelectorType,
109 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
110 drawClippedBitmap(canvas, 300, 100, paint);
111 paint.setImageFilter(SkDisplacementMapEffect::Create(
112 SkDisplacementMapEffect::kR_ChannelSelectorType,
113 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
114 drawClippedBitmap(canvas, 400, 100, paint);
115
116 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
117 paint.setImageFilter(SkDisplacementMapEffect::Create(
118 SkDisplacementMapEffect::kR_ChannelSelectorType,
119 SkDisplacementMapEffect::kG_ChannelSelectorType,
120 0.0f, displ, NULL, &cropRect))->unref();
121 drawClippedBitmap(canvas, 0, 200, paint);
122 paint.setImageFilter(SkDisplacementMapEffect::Create(
123 SkDisplacementMapEffect::kB_ChannelSelectorType,
124 SkDisplacementMapEffect::kA_ChannelSelectorType,
125 16.0f, displ, NULL, &cropRect))->unref();
126 drawClippedBitmap(canvas, 100, 200, paint);
127 paint.setImageFilter(SkDisplacementMapEffect::Create(
128 SkDisplacementMapEffect::kR_ChannelSelectorType,
129 SkDisplacementMapEffect::kB_ChannelSelectorType,
130 32.0f, displ, NULL, &cropRect))->unref();
131 drawClippedBitmap(canvas, 200, 200, paint);
132 paint.setImageFilter(SkDisplacementMapEffect::Create(
133 SkDisplacementMapEffect::kG_ChannelSelectorType,
134 SkDisplacementMapEffect::kA_ChannelSelectorType,
135 48.0f, displ, NULL, &cropRect))->unref();
136 drawClippedBitmap(canvas, 300, 200, paint);
137 paint.setImageFilter(SkDisplacementMapEffect::Create(
138 SkDisplacementMapEffect::kR_ChannelSelectorType,
139 SkDisplacementMapEffect::kA_ChannelSelectorType,
140 64.0f, displ, NULL, &cropRect))->unref();
141 drawClippedBitmap(canvas, 400, 200, paint);
142
143 paint.setImageFilter(SkDisplacementMapEffect::Create(
144 SkDisplacementMapEffect::kR_ChannelSelectorType,
145 SkDisplacementMapEffect::kG_ChannelSelectorType,
146 40.0f, displ, NULL, &cropRect))->unref();
147 drawClippedBitmap(canvas, 0, 300, paint);
148 paint.setImageFilter(SkDisplacementMapEffect::Create(
149 SkDisplacementMapEffect::kB_ChannelSelectorType,
150 SkDisplacementMapEffect::kA_ChannelSelectorType,
151 40.0f, displ, NULL, &cropRect))->unref();
152 drawClippedBitmap(canvas, 100, 300, paint);
153 paint.setImageFilter(SkDisplacementMapEffect::Create(
154 SkDisplacementMapEffect::kR_ChannelSelectorType,
155 SkDisplacementMapEffect::kB_ChannelSelectorType,
156 40.0f, displ, NULL, &cropRect))->unref();
157 drawClippedBitmap(canvas, 200, 300, paint);
158 paint.setImageFilter(SkDisplacementMapEffect::Create(
159 SkDisplacementMapEffect::kG_ChannelSelectorType,
160 SkDisplacementMapEffect::kA_ChannelSelectorType,
161 40.0f, displ, NULL, &cropRect))->unref();
162 drawClippedBitmap(canvas, 300, 300, paint);
163 paint.setImageFilter(SkDisplacementMapEffect::Create(
164 SkDisplacementMapEffect::kR_ChannelSelectorType,
165 SkDisplacementMapEffect::kA_ChannelSelectorType,
166 40.0f, displ, NULL, &cropRect))->unref();
167 drawClippedBitmap(canvas, 400, 300, paint);
168
169 // Tests for images of different sizes
170 displ.reset(SkBitmapSource::Create(fSmall));
171 paint.setImageFilter(SkDisplacementMapEffect::Create(
172 SkDisplacementMapEffect::kR_ChannelSelectorType,
173 SkDisplacementMapEffect::kG_ChannelSelectorType,
174 40.0f, displ))->unref();
175 drawClippedBitmap(canvas, 0, 400, paint);
176 displ.reset(SkBitmapSource::Create(fLarge));
177 paint.setImageFilter(SkDisplacementMapEffect::Create(
178 SkDisplacementMapEffect::kB_ChannelSelectorType,
179 SkDisplacementMapEffect::kA_ChannelSelectorType,
180 40.0f, displ))->unref();
181 drawClippedBitmap(canvas, 100, 400, paint);
182 displ.reset(SkBitmapSource::Create(fLargeW));
183 paint.setImageFilter(SkDisplacementMapEffect::Create(
184 SkDisplacementMapEffect::kR_ChannelSelectorType,
185 SkDisplacementMapEffect::kB_ChannelSelectorType,
186 40.0f, displ))->unref();
187 drawClippedBitmap(canvas, 200, 400, paint);
188 displ.reset(SkBitmapSource::Create(fLargeH));
189 paint.setImageFilter(SkDisplacementMapEffect::Create(
190 SkDisplacementMapEffect::kG_ChannelSelectorType,
191 SkDisplacementMapEffect::kA_ChannelSelectorType,
192 40.0f, displ))->unref();
193 drawClippedBitmap(canvas, 300, 400, paint);
194
195 // Test for no given displacement input. In this case, both displacement
196 // and color should use the same bitmap, given to SkCanvas::drawBitmap()
197 // as an input argument.
198 paint.setImageFilter(SkDisplacementMapEffect::Create(
199 SkDisplacementMapEffect::kG_ChannelSelectorType,
200 SkDisplacementMapEffect::kA_ChannelSelectorType,
201 40.0f, NULL))->unref();
202 drawClippedBitmap(canvas, 400, 400, paint);
203 }
204
205 private:
206 typedef GM INHERITED;
207 SkBitmap fBitmap, fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
208 bool fInitialized;
209 };
210
211 //////////////////////////////////////////////////////////////////////////////
212
MyFactory(void *)213 static GM* MyFactory(void*) { return new DisplacementMapGM; }
214 static GMRegistry reg(MyFactory);
215
216 }
217