• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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