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