blob: 4746ef7118e85799384152ff4802c9c58704907d [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
sugoi@google.com781cc762013-01-15 15:40:19 +00008#include "SkBitmapSource.h"
halcanary878fa022015-01-26 11:24:32 -08009#include "SkDisplacementMapEffect.h"
10#include "gm.h"
robertphillips3e5c2b12015-03-23 05:46:51 -070011#include "sk_tool_utils.h"
sugoi@google.com781cc762013-01-15 15:40:19 +000012
13namespace skiagm {
14
15class DisplacementMapGM : public GM {
16public:
robertphillips943a4622015-09-03 13:32:33 -070017 DisplacementMapGM() {
sugoi@google.com781cc762013-01-15 15:40:19 +000018 this->setBGColor(0xFF000000);
19 }
20
21protected:
robertphillips943a4622015-09-03 13:32:33 -070022 SkString onShortName() override {
sugoi@google.com781cc762013-01-15 15:40:19 +000023 return SkString("displacement");
24 }
25
robertphillips943a4622015-09-03 13:32:33 -070026 void onOnceBeforeDraw() override {
27 fBitmap = sk_tool_utils::create_string_bitmap(80, 80, 0xFF884422, 15, 55, 96, "g");
28
29 SkColor c1 = sk_tool_utils::color_to_565(0xFF244484);
30 SkColor c2 = sk_tool_utils::color_to_565(0xFF804020);
31
32 fCheckerboard = sk_tool_utils::create_checkerboard_bitmap(80, 80, c1, c2, 8);
33 fSmall = sk_tool_utils::create_checkerboard_bitmap(64, 64, c1, c2, 8);
34 fLarge = sk_tool_utils::create_checkerboard_bitmap(96, 96, c1, c2, 8);
35 fLargeW = sk_tool_utils::create_checkerboard_bitmap(96, 64, c1, c2, 8);
36 fLargeH = sk_tool_utils::create_checkerboard_bitmap(64, 96, c1, c2, 8);
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +000037 }
38
robertphillips943a4622015-09-03 13:32:33 -070039 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070040 return SkISize::Make(500, 500);
sugoi@google.com781cc762013-01-15 15:40:19 +000041 }
skia.committer@gmail.comff21c2e2013-01-16 07:05:56 +000042
robertphillips943a4622015-09-03 13:32:33 -070043 void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) const {
sugoi@google.com781cc762013-01-15 15:40:19 +000044 canvas->save();
senorblanco@chromium.orgbc386ce2013-10-15 19:30:58 +000045 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +000046 canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
47 canvas->drawBitmap(fBitmap, 0, 0, &paint);
sugoi@google.com781cc762013-01-15 15:40:19 +000048 canvas->restore();
49 }
50
robertphillips943a4622015-09-03 13:32:33 -070051 void onDraw(SkCanvas* canvas) override {
senorblanco16b254a2015-04-09 11:13:24 -070052 canvas->clear(SK_ColorBLACK);
sugoi@google.com781cc762013-01-15 15:40:19 +000053 SkPaint paint;
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000054 SkAutoTUnref<SkImageFilter> displ(SkBitmapSource::Create(fCheckerboard));
55 paint.setImageFilter(SkDisplacementMapEffect::Create(
56 SkDisplacementMapEffect::kR_ChannelSelectorType,
57 SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000058 drawClippedBitmap(canvas, 0, 0, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000059 paint.setImageFilter(SkDisplacementMapEffect::Create(
60 SkDisplacementMapEffect::kB_ChannelSelectorType,
61 SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000062 drawClippedBitmap(canvas, 100, 0, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000063 paint.setImageFilter(SkDisplacementMapEffect::Create(
64 SkDisplacementMapEffect::kR_ChannelSelectorType,
65 SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000066 drawClippedBitmap(canvas, 200, 0, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000067 paint.setImageFilter(SkDisplacementMapEffect::Create(
68 SkDisplacementMapEffect::kG_ChannelSelectorType,
69 SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000070 drawClippedBitmap(canvas, 300, 0, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000071 paint.setImageFilter(SkDisplacementMapEffect::Create(
72 SkDisplacementMapEffect::kR_ChannelSelectorType,
73 SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000074 drawClippedBitmap(canvas, 400, 0, paint);
75
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000076 paint.setImageFilter(SkDisplacementMapEffect::Create(
77 SkDisplacementMapEffect::kR_ChannelSelectorType,
78 SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000079 drawClippedBitmap(canvas, 0, 100, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000080 paint.setImageFilter(SkDisplacementMapEffect::Create(
81 SkDisplacementMapEffect::kB_ChannelSelectorType,
82 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000083 drawClippedBitmap(canvas, 100, 100, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000084 paint.setImageFilter(SkDisplacementMapEffect::Create(
85 SkDisplacementMapEffect::kR_ChannelSelectorType,
86 SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000087 drawClippedBitmap(canvas, 200, 100, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000088 paint.setImageFilter(SkDisplacementMapEffect::Create(
89 SkDisplacementMapEffect::kG_ChannelSelectorType,
90 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000091 drawClippedBitmap(canvas, 300, 100, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000092 paint.setImageFilter(SkDisplacementMapEffect::Create(
93 SkDisplacementMapEffect::kR_ChannelSelectorType,
94 SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
sugoi@google.com781cc762013-01-15 15:40:19 +000095 drawClippedBitmap(canvas, 400, 100, paint);
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +000096
97 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000098 paint.setImageFilter(SkDisplacementMapEffect::Create(
99 SkDisplacementMapEffect::kR_ChannelSelectorType,
100 SkDisplacementMapEffect::kG_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700101 0.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000102 drawClippedBitmap(canvas, 0, 200, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000103 paint.setImageFilter(SkDisplacementMapEffect::Create(
104 SkDisplacementMapEffect::kB_ChannelSelectorType,
105 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700106 16.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000107 drawClippedBitmap(canvas, 100, 200, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000108 paint.setImageFilter(SkDisplacementMapEffect::Create(
109 SkDisplacementMapEffect::kR_ChannelSelectorType,
110 SkDisplacementMapEffect::kB_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700111 32.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000112 drawClippedBitmap(canvas, 200, 200, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000113 paint.setImageFilter(SkDisplacementMapEffect::Create(
114 SkDisplacementMapEffect::kG_ChannelSelectorType,
115 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700116 48.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000117 drawClippedBitmap(canvas, 300, 200, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000118 paint.setImageFilter(SkDisplacementMapEffect::Create(
119 SkDisplacementMapEffect::kR_ChannelSelectorType,
120 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700121 64.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000122 drawClippedBitmap(canvas, 400, 200, paint);
123
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000124 paint.setImageFilter(SkDisplacementMapEffect::Create(
125 SkDisplacementMapEffect::kR_ChannelSelectorType,
126 SkDisplacementMapEffect::kG_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700127 40.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000128 drawClippedBitmap(canvas, 0, 300, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000129 paint.setImageFilter(SkDisplacementMapEffect::Create(
130 SkDisplacementMapEffect::kB_ChannelSelectorType,
131 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700132 40.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000133 drawClippedBitmap(canvas, 100, 300, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000134 paint.setImageFilter(SkDisplacementMapEffect::Create(
135 SkDisplacementMapEffect::kR_ChannelSelectorType,
136 SkDisplacementMapEffect::kB_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700137 40.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000138 drawClippedBitmap(canvas, 200, 300, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000139 paint.setImageFilter(SkDisplacementMapEffect::Create(
140 SkDisplacementMapEffect::kG_ChannelSelectorType,
141 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700142 40.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000143 drawClippedBitmap(canvas, 300, 300, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000144 paint.setImageFilter(SkDisplacementMapEffect::Create(
145 SkDisplacementMapEffect::kR_ChannelSelectorType,
146 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700147 40.0f, displ, nullptr, &cropRect))->unref();
senorblanco@chromium.org01bdf3c2013-10-15 19:02:43 +0000148 drawClippedBitmap(canvas, 400, 300, paint);
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000149
commit-bot@chromium.org6d7296a2013-12-19 17:00:46 +0000150 // Tests for images of different sizes
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000151 displ.reset(SkBitmapSource::Create(fSmall));
152 paint.setImageFilter(SkDisplacementMapEffect::Create(
153 SkDisplacementMapEffect::kR_ChannelSelectorType,
154 SkDisplacementMapEffect::kG_ChannelSelectorType,
155 40.0f, displ))->unref();
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000156 drawClippedBitmap(canvas, 0, 400, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000157 displ.reset(SkBitmapSource::Create(fLarge));
158 paint.setImageFilter(SkDisplacementMapEffect::Create(
159 SkDisplacementMapEffect::kB_ChannelSelectorType,
160 SkDisplacementMapEffect::kA_ChannelSelectorType,
161 40.0f, displ))->unref();
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000162 drawClippedBitmap(canvas, 100, 400, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000163 displ.reset(SkBitmapSource::Create(fLargeW));
164 paint.setImageFilter(SkDisplacementMapEffect::Create(
165 SkDisplacementMapEffect::kR_ChannelSelectorType,
166 SkDisplacementMapEffect::kB_ChannelSelectorType,
167 40.0f, displ))->unref();
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000168 drawClippedBitmap(canvas, 200, 400, paint);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000169 displ.reset(SkBitmapSource::Create(fLargeH));
170 paint.setImageFilter(SkDisplacementMapEffect::Create(
171 SkDisplacementMapEffect::kG_ChannelSelectorType,
172 SkDisplacementMapEffect::kA_ChannelSelectorType,
173 40.0f, displ))->unref();
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000174 drawClippedBitmap(canvas, 300, 400, paint);
commit-bot@chromium.org6d7296a2013-12-19 17:00:46 +0000175
176 // Test for no given displacement input. In this case, both displacement
177 // and color should use the same bitmap, given to SkCanvas::drawBitmap()
178 // as an input argument.
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000179 paint.setImageFilter(SkDisplacementMapEffect::Create(
180 SkDisplacementMapEffect::kG_ChannelSelectorType,
181 SkDisplacementMapEffect::kA_ChannelSelectorType,
halcanary96fcdcc2015-08-27 07:41:13 -0700182 40.0f, nullptr))->unref();
commit-bot@chromium.org6d7296a2013-12-19 17:00:46 +0000183 drawClippedBitmap(canvas, 400, 400, paint);
sugoi@google.com781cc762013-01-15 15:40:19 +0000184 }
185
186private:
commit-bot@chromium.org5e79c2b2013-12-12 21:48:32 +0000187 SkBitmap fBitmap, fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
robertphillips943a4622015-09-03 13:32:33 -0700188
189 typedef GM INHERITED;
sugoi@google.com781cc762013-01-15 15:40:19 +0000190};
191
192//////////////////////////////////////////////////////////////////////////////
193
robertphillips943a4622015-09-03 13:32:33 -0700194DEF_GM(return new DisplacementMapGM;)
sugoi@google.com781cc762013-01-15 15:40:19 +0000195}