• Home
  • 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 "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 = SkImage::MakeFromBitmap(
34             sk_tool_utils::create_checkerboard_bitmap(80, 80, c1, c2, 8));
35         fSmall = SkImage::MakeFromBitmap(
36             sk_tool_utils::create_checkerboard_bitmap(64, 64, c1, c2, 8));
37         fLarge = SkImage::MakeFromBitmap(
38             sk_tool_utils::create_checkerboard_bitmap(96, 96, c1, c2, 8));
39         fLargeW =
40             SkImage::MakeFromBitmap(sk_tool_utils::create_checkerboard_bitmap(96, 64, c1, c2, 8));
41         fLargeH = SkImage::MakeFromBitmap(
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         sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
61         paint.setImageFilter(SkDisplacementMapEffect::Make(
62             SkDisplacementMapEffect::kR_ChannelSelectorType,
63             SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ, nullptr));
64         this->drawClippedBitmap(canvas, 0, 0, paint);
65         paint.setImageFilter(SkDisplacementMapEffect::Make(
66             SkDisplacementMapEffect::kB_ChannelSelectorType,
67             SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ, nullptr));
68         this->drawClippedBitmap(canvas, 100, 0, paint);
69         paint.setImageFilter(SkDisplacementMapEffect::Make(
70             SkDisplacementMapEffect::kR_ChannelSelectorType,
71             SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ, nullptr));
72         this->drawClippedBitmap(canvas, 200, 0, paint);
73         paint.setImageFilter(SkDisplacementMapEffect::Make(
74             SkDisplacementMapEffect::kG_ChannelSelectorType,
75             SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ, nullptr));
76         this->drawClippedBitmap(canvas, 300, 0, paint);
77         paint.setImageFilter(SkDisplacementMapEffect::Make(
78             SkDisplacementMapEffect::kR_ChannelSelectorType,
79             SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ, nullptr));
80         this->drawClippedBitmap(canvas, 400, 0, paint);
81 
82         paint.setImageFilter(SkDisplacementMapEffect::Make(
83             SkDisplacementMapEffect::kR_ChannelSelectorType,
84             SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ, nullptr));
85         this->drawClippedBitmap(canvas, 0, 100, paint);
86         paint.setImageFilter(SkDisplacementMapEffect::Make(
87             SkDisplacementMapEffect::kB_ChannelSelectorType,
88             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
89         this->drawClippedBitmap(canvas, 100, 100, paint);
90         paint.setImageFilter(SkDisplacementMapEffect::Make(
91             SkDisplacementMapEffect::kR_ChannelSelectorType,
92             SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ, nullptr));
93         this->drawClippedBitmap(canvas, 200, 100, paint);
94         paint.setImageFilter(SkDisplacementMapEffect::Make(
95             SkDisplacementMapEffect::kG_ChannelSelectorType,
96             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
97         this->drawClippedBitmap(canvas, 300, 100, paint);
98         paint.setImageFilter(SkDisplacementMapEffect::Make(
99             SkDisplacementMapEffect::kR_ChannelSelectorType,
100             SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
101         this->drawClippedBitmap(canvas, 400, 100, paint);
102 
103         SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
104         paint.setImageFilter(SkDisplacementMapEffect::Make(
105             SkDisplacementMapEffect::kR_ChannelSelectorType,
106             SkDisplacementMapEffect::kG_ChannelSelectorType,
107             0.0f, displ, nullptr, &cropRect));
108         this->drawClippedBitmap(canvas, 0, 200, paint);
109         paint.setImageFilter(SkDisplacementMapEffect::Make(
110             SkDisplacementMapEffect::kB_ChannelSelectorType,
111             SkDisplacementMapEffect::kA_ChannelSelectorType,
112             16.0f, displ, nullptr, &cropRect));
113         this->drawClippedBitmap(canvas, 100, 200, paint);
114         paint.setImageFilter(SkDisplacementMapEffect::Make(
115             SkDisplacementMapEffect::kR_ChannelSelectorType,
116             SkDisplacementMapEffect::kB_ChannelSelectorType,
117             32.0f, displ, nullptr, &cropRect));
118         this->drawClippedBitmap(canvas, 200, 200, paint);
119         paint.setImageFilter(SkDisplacementMapEffect::Make(
120             SkDisplacementMapEffect::kG_ChannelSelectorType,
121             SkDisplacementMapEffect::kA_ChannelSelectorType,
122             48.0f, displ, nullptr, &cropRect));
123         this->drawClippedBitmap(canvas, 300, 200, paint);
124         paint.setImageFilter(SkDisplacementMapEffect::Make(
125             SkDisplacementMapEffect::kR_ChannelSelectorType,
126             SkDisplacementMapEffect::kA_ChannelSelectorType,
127             64.0f, displ, nullptr, &cropRect));
128         this->drawClippedBitmap(canvas, 400, 200, paint);
129 
130         paint.setImageFilter(SkDisplacementMapEffect::Make(
131             SkDisplacementMapEffect::kR_ChannelSelectorType,
132             SkDisplacementMapEffect::kG_ChannelSelectorType,
133             40.0f, displ, nullptr, &cropRect));
134         this->drawClippedBitmap(canvas, 0, 300, paint);
135         paint.setImageFilter(SkDisplacementMapEffect::Make(
136             SkDisplacementMapEffect::kB_ChannelSelectorType,
137             SkDisplacementMapEffect::kA_ChannelSelectorType,
138             40.0f, displ, nullptr, &cropRect));
139         this->drawClippedBitmap(canvas, 100, 300, paint);
140         paint.setImageFilter(SkDisplacementMapEffect::Make(
141             SkDisplacementMapEffect::kR_ChannelSelectorType,
142             SkDisplacementMapEffect::kB_ChannelSelectorType,
143             40.0f, displ, nullptr, &cropRect));
144         this->drawClippedBitmap(canvas, 200, 300, paint);
145         paint.setImageFilter(SkDisplacementMapEffect::Make(
146             SkDisplacementMapEffect::kG_ChannelSelectorType,
147             SkDisplacementMapEffect::kA_ChannelSelectorType,
148             40.0f, displ, nullptr, &cropRect));
149         this->drawClippedBitmap(canvas, 300, 300, paint);
150         paint.setImageFilter(SkDisplacementMapEffect::Make(
151             SkDisplacementMapEffect::kR_ChannelSelectorType,
152             SkDisplacementMapEffect::kA_ChannelSelectorType,
153             40.0f, displ, nullptr, &cropRect));
154         this->drawClippedBitmap(canvas, 400, 300, paint);
155 
156         // Test for negative scale.
157         paint.setImageFilter(SkDisplacementMapEffect::Make(
158             SkDisplacementMapEffect::kG_ChannelSelectorType,
159             SkDisplacementMapEffect::kA_ChannelSelectorType,
160             -40.0f, displ, nullptr));
161         this->drawClippedBitmap(canvas, 500, 0, paint);
162 
163         // Tests for images of different sizes
164         displ = SkImageSource::Make(fSmall);
165         paint.setImageFilter(SkDisplacementMapEffect::Make(
166             SkDisplacementMapEffect::kR_ChannelSelectorType,
167             SkDisplacementMapEffect::kG_ChannelSelectorType,
168             40.0f, std::move(displ), nullptr));
169         this->drawClippedBitmap(canvas, 0, 400, paint);
170         displ = SkImageSource::Make(fLarge);
171         paint.setImageFilter(SkDisplacementMapEffect::Make(
172             SkDisplacementMapEffect::kB_ChannelSelectorType,
173             SkDisplacementMapEffect::kA_ChannelSelectorType,
174             40.0f, std::move(displ), nullptr));
175         this->drawClippedBitmap(canvas, 100, 400, paint);
176         displ = SkImageSource::Make(fLargeW);
177         paint.setImageFilter(SkDisplacementMapEffect::Make(
178             SkDisplacementMapEffect::kR_ChannelSelectorType,
179             SkDisplacementMapEffect::kB_ChannelSelectorType,
180             40.0f, std::move(displ), nullptr));
181         this->drawClippedBitmap(canvas, 200, 400, paint);
182         displ = SkImageSource::Make(fLargeH);
183         paint.setImageFilter(SkDisplacementMapEffect::Make(
184             SkDisplacementMapEffect::kG_ChannelSelectorType,
185             SkDisplacementMapEffect::kA_ChannelSelectorType,
186             40.0f, std::move(displ), nullptr));
187         this->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::Make(
193             SkDisplacementMapEffect::kG_ChannelSelectorType,
194             SkDisplacementMapEffect::kA_ChannelSelectorType,
195             40.0f, nullptr, nullptr));
196         this->drawClippedBitmap(canvas, 400, 400, paint);
197     }
198 
199 private:
200     SkBitmap fBitmap;
201     sk_sp<SkImage> fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
202 
203     typedef GM INHERITED;
204 };
205 
206 //////////////////////////////////////////////////////////////////////////////
207 
208 DEF_GM(return new DisplacementMapGM;)
209 }
210