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 "SkColor.h" 10 #include "SkBicubicImageFilter.h" 11 12 namespace skiagm { 13 14 class BicubicGM : public GM { 15 public: 16 BicubicGM() : fInitialized(false) { 17 this->setBGColor(0x00000000); 18 } 19 20 protected: 21 virtual SkString onShortName() { 22 return SkString("bicubicfilter"); 23 } 24 25 void make_checkerboard(int width, int height) { 26 SkASSERT(width % 2 == 0); 27 SkASSERT(height % 2 == 0); 28 fCheckerboard.setConfig(SkBitmap::kARGB_8888_Config, width, height); 29 fCheckerboard.allocPixels(); 30 SkAutoLockPixels lock(fCheckerboard); 31 for (int y = 0; y < height; y += 2) { 32 SkPMColor* s = fCheckerboard.getAddr32(0, y); 33 for (int x = 0; x < width; x += 2) { 34 *s++ = 0xFFFFFFFF; 35 *s++ = 0xFF000000; 36 } 37 s = fCheckerboard.getAddr32(0, y + 1); 38 for (int x = 0; x < width; x += 2) { 39 *s++ = 0xFF000000; 40 *s++ = 0xFFFFFFFF; 41 } 42 } 43 } 44 45 virtual SkISize onISize() { 46 return make_isize(400, 300); 47 } 48 49 virtual void onDraw(SkCanvas* canvas) { 50 if (!fInitialized) { 51 make_checkerboard(4, 4); 52 fInitialized = true; 53 } 54 SkScalar sk32 = SkIntToScalar(32); 55 canvas->clear(0x00000000); 56 SkPaint bilinearPaint, bicubicPaint; 57 SkSize scale = SkSize::Make(sk32, sk32); 58 canvas->save(); 59 canvas->scale(sk32, sk32); 60 bilinearPaint.setFilterLevel(SkPaint::kLow_FilterLevel); 61 canvas->drawBitmap(fCheckerboard, 0, 0, &bilinearPaint); 62 canvas->restore(); 63 SkAutoTUnref<SkImageFilter> bicubic(SkBicubicImageFilter::CreateMitchell(scale)); 64 bicubicPaint.setImageFilter(bicubic); 65 SkRect srcBounds; 66 fCheckerboard.getBounds(&srcBounds); 67 canvas->translate(SkIntToScalar(140), 0); 68 canvas->saveLayer(&srcBounds, &bicubicPaint); 69 canvas->drawBitmap(fCheckerboard, 0, 0); 70 canvas->restore(); 71 } 72 73 private: 74 typedef GM INHERITED; 75 SkBitmap fCheckerboard; 76 bool fInitialized; 77 }; 78 79 ////////////////////////////////////////////////////////////////////////////// 80 81 static GM* MyFactory(void*) { return new BicubicGM; } 82 static GMRegistry reg(MyFactory); 83 84 } 85