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 "SkOffsetImageFilter.h" 10 #include "SkBitmapSource.h" 11 12 #define WIDTH 400 13 #define HEIGHT 100 14 #define MARGIN 12 15 16 namespace skiagm { 17 18 class OffsetImageFilterGM : public GM { 19 public: 20 OffsetImageFilterGM() : fInitialized(false) { 21 this->setBGColor(0xFF000000); 22 } 23 24 protected: 25 virtual SkString onShortName() { 26 return SkString("offsetimagefilter"); 27 } 28 29 void make_bitmap() { 30 fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 80, 80); 31 fBitmap.allocPixels(); 32 SkBitmapDevice device(fBitmap); 33 SkCanvas canvas(&device); 34 canvas.clear(0x00000000); 35 SkPaint paint; 36 paint.setAntiAlias(true); 37 paint.setColor(0xD000D000); 38 paint.setTextSize(SkIntToScalar(96)); 39 const char* str = "e"; 40 canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint); 41 } 42 43 void make_checkerboard() { 44 fCheckerboard.setConfig(SkBitmap::kARGB_8888_Config, 80, 80); 45 fCheckerboard.allocPixels(); 46 SkBitmapDevice device(fCheckerboard); 47 SkCanvas canvas(&device); 48 canvas.clear(0x00000000); 49 SkPaint darkPaint; 50 darkPaint.setColor(0xFF404040); 51 SkPaint lightPaint; 52 lightPaint.setColor(0xFFA0A0A0); 53 for (int y = 0; y < 80; y += 16) { 54 for (int x = 0; x < 80; x += 16) { 55 canvas.save(); 56 canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 57 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 58 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 59 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 60 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 61 canvas.restore(); 62 } 63 } 64 } 65 66 virtual SkISize onISize() { 67 return make_isize(WIDTH, HEIGHT); 68 } 69 70 void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, 71 SkScalar x, SkScalar y) { 72 canvas->save(); 73 canvas->clipRect(SkRect::MakeXYWH(x, y, 74 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()))); 75 canvas->drawBitmap(bitmap, x, y, &paint); 76 canvas->restore(); 77 } 78 79 virtual void onDraw(SkCanvas* canvas) { 80 if (!fInitialized) { 81 make_bitmap(); 82 make_checkerboard(); 83 fInitialized = true; 84 } 85 canvas->clear(0x00000000); 86 SkPaint paint; 87 88 int x = 0, y = 0; 89 for (size_t i = 0; i < 4; i++) { 90 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap; 91 SkIRect cropRect = SkIRect::MakeXYWH(x + i * 12, 92 y + i * 8, 93 bitmap->width() - i * 8, 94 bitmap->height() - i * 12); 95 SkImageFilter::CropRect rect(SkRect::Make(cropRect)); 96 SkAutoTUnref<SkImageFilter> tileInput(SkNEW_ARGS(SkBitmapSource, (*bitmap))); 97 SkScalar dx = SkIntToScalar(i*5); 98 SkScalar dy = SkIntToScalar(i*10); 99 SkAutoTUnref<SkImageFilter> filter(SkNEW_ARGS( 100 SkOffsetImageFilter, (dx, dy, tileInput, &rect))); 101 paint.setImageFilter(filter); 102 drawClippedBitmap(canvas, *bitmap, paint, SkIntToScalar(x), SkIntToScalar(y)); 103 x += bitmap->width() + MARGIN; 104 if (x + bitmap->width() > WIDTH) { 105 x = 0; 106 y += bitmap->height() + MARGIN; 107 } 108 } 109 } 110 private: 111 typedef GM INHERITED; 112 SkBitmap fBitmap, fCheckerboard; 113 bool fInitialized; 114 }; 115 116 ////////////////////////////////////////////////////////////////////////////// 117 118 static GM* MyFactory(void*) { return new OffsetImageFilterGM; } 119 static GMRegistry reg(MyFactory); 120 121 } 122