blob: b788d6f4d724e5981933a06b958ade0f7778d06d [file] [log] [blame]
sugoi@google.com781cc762013-01-15 15:40:19 +00001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkImageFilter.h"
14#include "include/core/SkPaint.h"
15#include "include/core/SkRect.h"
16#include "include/core/SkRefCnt.h"
17#include "include/core/SkScalar.h"
18#include "include/core/SkSize.h"
19#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "include/effects/SkDisplacementMapEffect.h"
21#include "include/effects/SkImageSource.h"
22#include "tools/ToolUtils.h"
sugoi@google.com781cc762013-01-15 15:40:19 +000023
Ben Wagner7fde8e12019-05-01 17:28:53 -040024#include <utility>
25
sugoi@google.com781cc762013-01-15 15:40:19 +000026namespace skiagm {
27
28class DisplacementMapGM : public GM {
29public:
robertphillips943a4622015-09-03 13:32:33 -070030 DisplacementMapGM() {
sugoi@google.com781cc762013-01-15 15:40:19 +000031 this->setBGColor(0xFF000000);
32 }
33
34protected:
robertphillips943a4622015-09-03 13:32:33 -070035 SkString onShortName() override {
sugoi@google.com781cc762013-01-15 15:40:19 +000036 return SkString("displacement");
37 }
38
robertphillips943a4622015-09-03 13:32:33 -070039 void onOnceBeforeDraw() override {
Mike Kleinea3f0142019-03-20 11:12:10 -050040 fBitmap = ToolUtils::create_string_bitmap(80, 80, 0xFF884422, 15, 55, 96, "g");
robertphillips943a4622015-09-03 13:32:33 -070041
Mike Kleinea3f0142019-03-20 11:12:10 -050042 SkColor c1 = ToolUtils::color_to_565(0xFF244484);
43 SkColor c2 = ToolUtils::color_to_565(0xFF804020);
robertphillips943a4622015-09-03 13:32:33 -070044
Mike Kleinea3f0142019-03-20 11:12:10 -050045 fCheckerboard =
46 SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(80, 80, c1, c2, 8));
47 fSmall = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(64, 64, c1, c2, 8));
48 fLarge = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(96, 96, c1, c2, 8));
49 fLargeW = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(96, 64, c1, c2, 8));
50 fLargeH = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(64, 96, c1, c2, 8));
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +000051 }
52
robertphillips943a4622015-09-03 13:32:33 -070053 SkISize onISize() override {
senorblanco00502372016-01-21 09:55:47 -080054 return SkISize::Make(600, 500);
sugoi@google.com781cc762013-01-15 15:40:19 +000055 }
skia.committer@gmail.comff21c2e2013-01-16 07:05:56 +000056
robertphillips943a4622015-09-03 13:32:33 -070057 void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) const {
sugoi@google.com781cc762013-01-15 15:40:19 +000058 canvas->save();
senorblanco@chromium.orgbc386ce2013-10-15 19:30:58 +000059 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +000060 canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
61 canvas->drawBitmap(fBitmap, 0, 0, &paint);
sugoi@google.com781cc762013-01-15 15:40:19 +000062 canvas->restore();
63 }
64
robertphillips943a4622015-09-03 13:32:33 -070065 void onDraw(SkCanvas* canvas) override {
senorblanco16b254a2015-04-09 11:13:24 -070066 canvas->clear(SK_ColorBLACK);
sugoi@google.com781cc762013-01-15 15:40:19 +000067 SkPaint paint;
robertphillips549c8992016-04-01 09:28:51 -070068 sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
robertphillipsbfe11fc2016-04-15 07:17:36 -070069 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000070 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070071 SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ, nullptr));
72 this->drawClippedBitmap(canvas, 0, 0, paint);
73 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000074 SkDisplacementMapEffect::kB_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070075 SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ, nullptr));
76 this->drawClippedBitmap(canvas, 100, 0, paint);
77 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000078 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070079 SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ, nullptr));
80 this->drawClippedBitmap(canvas, 200, 0, paint);
81 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000082 SkDisplacementMapEffect::kG_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070083 SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ, nullptr));
84 this->drawClippedBitmap(canvas, 300, 0, paint);
85 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000086 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070087 SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ, nullptr));
88 this->drawClippedBitmap(canvas, 400, 0, paint);
sugoi@google.com781cc762013-01-15 15:40:19 +000089
robertphillipsbfe11fc2016-04-15 07:17:36 -070090 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000091 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070092 SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ, nullptr));
93 this->drawClippedBitmap(canvas, 0, 100, paint);
94 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000095 SkDisplacementMapEffect::kB_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -070096 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
97 this->drawClippedBitmap(canvas, 100, 100, paint);
98 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000099 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700100 SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ, nullptr));
101 this->drawClippedBitmap(canvas, 200, 100, paint);
102 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000103 SkDisplacementMapEffect::kG_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700104 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
105 this->drawClippedBitmap(canvas, 300, 100, paint);
106 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000107 SkDisplacementMapEffect::kR_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700108 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
109 this->drawClippedBitmap(canvas, 400, 100, paint);
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000110
111 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
robertphillipsbfe11fc2016-04-15 07:17:36 -0700112 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000113 SkDisplacementMapEffect::kR_ChannelSelectorType,
114 SkDisplacementMapEffect::kG_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700115 0.0f, displ, nullptr, &cropRect));
116 this->drawClippedBitmap(canvas, 0, 200, paint);
117 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000118 SkDisplacementMapEffect::kB_ChannelSelectorType,
119 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700120 16.0f, displ, nullptr, &cropRect));
121 this->drawClippedBitmap(canvas, 100, 200, paint);
122 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000123 SkDisplacementMapEffect::kR_ChannelSelectorType,
124 SkDisplacementMapEffect::kB_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700125 32.0f, displ, nullptr, &cropRect));
126 this->drawClippedBitmap(canvas, 200, 200, paint);
127 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000128 SkDisplacementMapEffect::kG_ChannelSelectorType,
129 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700130 48.0f, displ, nullptr, &cropRect));
131 this->drawClippedBitmap(canvas, 300, 200, paint);
132 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000133 SkDisplacementMapEffect::kR_ChannelSelectorType,
134 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700135 64.0f, displ, nullptr, &cropRect));
136 this->drawClippedBitmap(canvas, 400, 200, paint);
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000137
robertphillipsbfe11fc2016-04-15 07:17:36 -0700138 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000139 SkDisplacementMapEffect::kR_ChannelSelectorType,
140 SkDisplacementMapEffect::kG_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700141 40.0f, displ, nullptr, &cropRect));
142 this->drawClippedBitmap(canvas, 0, 300, paint);
143 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000144 SkDisplacementMapEffect::kB_ChannelSelectorType,
145 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700146 40.0f, displ, nullptr, &cropRect));
147 this->drawClippedBitmap(canvas, 100, 300, paint);
148 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000149 SkDisplacementMapEffect::kR_ChannelSelectorType,
150 SkDisplacementMapEffect::kB_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700151 40.0f, displ, nullptr, &cropRect));
152 this->drawClippedBitmap(canvas, 200, 300, paint);
153 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000154 SkDisplacementMapEffect::kG_ChannelSelectorType,
155 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700156 40.0f, displ, nullptr, &cropRect));
157 this->drawClippedBitmap(canvas, 300, 300, paint);
158 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000159 SkDisplacementMapEffect::kR_ChannelSelectorType,
160 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700161 40.0f, displ, nullptr, &cropRect));
162 this->drawClippedBitmap(canvas, 400, 300, paint);
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000163
senorblanco00502372016-01-21 09:55:47 -0800164 // Test for negative scale.
robertphillipsbfe11fc2016-04-15 07:17:36 -0700165 paint.setImageFilter(SkDisplacementMapEffect::Make(
senorblanco00502372016-01-21 09:55:47 -0800166 SkDisplacementMapEffect::kG_ChannelSelectorType,
167 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700168 -40.0f, displ, nullptr));
senorblanco00502372016-01-21 09:55:47 -0800169 this->drawClippedBitmap(canvas, 500, 0, paint);
170
commit-bot@chromium.org6d7296a2013-12-19 17:00:46 +0000171 // Tests for images of different sizes
robertphillips549c8992016-04-01 09:28:51 -0700172 displ = SkImageSource::Make(fSmall);
robertphillipsbfe11fc2016-04-15 07:17:36 -0700173 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000174 SkDisplacementMapEffect::kR_ChannelSelectorType,
175 SkDisplacementMapEffect::kG_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700176 40.0f, std::move(displ), nullptr));
177 this->drawClippedBitmap(canvas, 0, 400, paint);
robertphillips549c8992016-04-01 09:28:51 -0700178 displ = SkImageSource::Make(fLarge);
robertphillipsbfe11fc2016-04-15 07:17:36 -0700179 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000180 SkDisplacementMapEffect::kB_ChannelSelectorType,
181 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700182 40.0f, std::move(displ), nullptr));
183 this->drawClippedBitmap(canvas, 100, 400, paint);
robertphillips549c8992016-04-01 09:28:51 -0700184 displ = SkImageSource::Make(fLargeW);
robertphillipsbfe11fc2016-04-15 07:17:36 -0700185 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000186 SkDisplacementMapEffect::kR_ChannelSelectorType,
187 SkDisplacementMapEffect::kB_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700188 40.0f, std::move(displ), nullptr));
189 this->drawClippedBitmap(canvas, 200, 400, paint);
robertphillips549c8992016-04-01 09:28:51 -0700190 displ = SkImageSource::Make(fLargeH);
robertphillipsbfe11fc2016-04-15 07:17:36 -0700191 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000192 SkDisplacementMapEffect::kG_ChannelSelectorType,
193 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700194 40.0f, std::move(displ), nullptr));
195 this->drawClippedBitmap(canvas, 300, 400, paint);
commit-bot@chromium.org6d7296a2013-12-19 17:00:46 +0000196
197 // Test for no given displacement input. In this case, both displacement
198 // and color should use the same bitmap, given to SkCanvas::drawBitmap()
199 // as an input argument.
robertphillipsbfe11fc2016-04-15 07:17:36 -0700200 paint.setImageFilter(SkDisplacementMapEffect::Make(
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000201 SkDisplacementMapEffect::kG_ChannelSelectorType,
202 SkDisplacementMapEffect::kA_ChannelSelectorType,
robertphillipsbfe11fc2016-04-15 07:17:36 -0700203 40.0f, nullptr, nullptr));
204 this->drawClippedBitmap(canvas, 400, 400, paint);
sugoi@google.com781cc762013-01-15 15:40:19 +0000205 }
206
207private:
fmalita5598b632015-09-15 11:26:13 -0700208 SkBitmap fBitmap;
reed9ce9d672016-03-17 10:51:11 -0700209 sk_sp<SkImage> fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
robertphillips943a4622015-09-03 13:32:33 -0700210
211 typedef GM INHERITED;
sugoi@google.com781cc762013-01-15 15:40:19 +0000212};
213
214//////////////////////////////////////////////////////////////////////////////
215
robertphillips943a4622015-09-03 13:32:33 -0700216DEF_GM(return new DisplacementMapGM;)
sugoi@google.com781cc762013-01-15 15:40:19 +0000217}