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