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