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