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 "sk_tool_utils.h" 9 #include "SkBitmapSource.h" 10 #include "SkOffsetImageFilter.h" 11 #include "gm.h" 12 13 #define WIDTH 600 14 #define HEIGHT 100 15 #define MARGIN 12 16 17 namespace skiagm { 18 19 class OffsetImageFilterGM : public GM { 20 public: 21 OffsetImageFilterGM() : fInitialized(false) { 22 this->setBGColor(0xFF000000); 23 } 24 25 protected: 26 virtual SkString onShortName() { 27 return SkString("offsetimagefilter"); 28 } 29 30 void make_bitmap() { 31 fBitmap.allocN32Pixels(80, 80); 32 SkCanvas canvas(fBitmap); 33 canvas.clear(0x00000000); 34 SkPaint paint; 35 paint.setAntiAlias(true); 36 sk_tool_utils::set_portable_typeface(&paint); 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 virtual SkISize onISize() { 44 return SkISize::Make(WIDTH, HEIGHT); 45 } 46 47 void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, SkScalar scale, const SkIRect& cropRect) { 48 canvas->save(); 49 SkRect clipRect = SkRect::MakeWH( 50 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); 51 canvas->clipRect(clipRect); 52 canvas->scale(scale, scale); 53 canvas->drawBitmap(bitmap, 0, 0, &paint); 54 canvas->restore(); 55 SkPaint strokePaint; 56 strokePaint.setStyle(SkPaint::kStroke_Style); 57 strokePaint.setColor(SK_ColorRED); 58 59 // Draw a boundary rect around the intersection of the clip rect 60 // and crop rect. 61 SkMatrix scaleMatrix; 62 scaleMatrix.setScale(scale, scale); 63 SkRect cropRectFloat; 64 scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect)); 65 if (clipRect.intersect(cropRectFloat)) { 66 canvas->drawRect(clipRect, strokePaint); 67 } 68 } 69 70 virtual void onDraw(SkCanvas* canvas) { 71 if (!fInitialized) { 72 make_bitmap(); 73 74 fCheckerboard.allocN32Pixels(80, 80); 75 SkCanvas checkerboardCanvas(fCheckerboard); 76 sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8); 77 78 fInitialized = true; 79 } 80 canvas->clear(SK_ColorBLACK); 81 SkPaint paint; 82 83 for (int i = 0; i < 4; i++) { 84 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap; 85 SkIRect cropRect = SkIRect::MakeXYWH(i * 12, 86 i * 8, 87 bitmap->width() - i * 8, 88 bitmap->height() - i * 12); 89 SkImageFilter::CropRect rect(SkRect::Make(cropRect)); 90 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap)); 91 SkScalar dx = SkIntToScalar(i*5); 92 SkScalar dy = SkIntToScalar(i*10); 93 SkAutoTUnref<SkImageFilter> filter( 94 SkOffsetImageFilter::Create(dx, dy, tileInput, &rect)); 95 paint.setImageFilter(filter); 96 drawClippedBitmap(canvas, *bitmap, paint, SK_Scalar1, cropRect); 97 canvas->translate(SkIntToScalar(bitmap->width() + MARGIN), 0); 98 } 99 100 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100); 101 SkImageFilter::CropRect rect(SkRect::Make(cropRect)); 102 SkAutoTUnref<SkImageFilter> filter( 103 SkOffsetImageFilter::Create(SkIntToScalar(-5), SkIntToScalar(-10), NULL, &rect)); 104 paint.setImageFilter(filter); 105 drawClippedBitmap(canvas, fBitmap, paint, SkIntToScalar(2), cropRect); 106 } 107 private: 108 typedef GM INHERITED; 109 SkBitmap fBitmap, fCheckerboard; 110 bool fInitialized; 111 }; 112 113 ////////////////////////////////////////////////////////////////////////////// 114 115 static GM* MyFactory(void*) { return new OffsetImageFilterGM; } 116 static GMRegistry reg(MyFactory); 117 118 } 119