/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm.h" #include "SkColor.h" #include "SkBicubicImageFilter.h" namespace skiagm { class BicubicGM : public GM { public: BicubicGM() : fInitialized(false) { this->setBGColor(0x00000000); } protected: virtual SkString onShortName() { return SkString("bicubicfilter"); } void make_checkerboard(int width, int height) { SkASSERT(width % 2 == 0); SkASSERT(height % 2 == 0); fCheckerboard.setConfig(SkBitmap::kARGB_8888_Config, width, height); fCheckerboard.allocPixels(); SkAutoLockPixels lock(fCheckerboard); for (int y = 0; y < height; y += 2) { SkPMColor* s = fCheckerboard.getAddr32(0, y); for (int x = 0; x < width; x += 2) { *s++ = 0xFFFFFFFF; *s++ = 0xFF000000; } s = fCheckerboard.getAddr32(0, y + 1); for (int x = 0; x < width; x += 2) { *s++ = 0xFF000000; *s++ = 0xFFFFFFFF; } } } virtual SkISize onISize() { return make_isize(400, 300); } virtual void onDraw(SkCanvas* canvas) { if (!fInitialized) { make_checkerboard(4, 4); fInitialized = true; } SkScalar sk32 = SkIntToScalar(32); canvas->clear(0x00000000); SkPaint bilinearPaint, bicubicPaint; SkSize scale = SkSize::Make(sk32, sk32); canvas->save(); canvas->scale(sk32, sk32); bilinearPaint.setFilterBitmap(true); canvas->drawBitmap(fCheckerboard, 0, 0, &bilinearPaint); canvas->restore(); SkAutoTUnref<SkImageFilter> bicubic(SkBicubicImageFilter::CreateMitchell(scale)); bicubicPaint.setImageFilter(bicubic); SkRect srcBounds; fCheckerboard.getBounds(&srcBounds); canvas->translate(SkIntToScalar(140), 0); canvas->saveLayer(&srcBounds, &bicubicPaint); canvas->drawBitmap(fCheckerboard, 0, 0); canvas->restore(); } private: typedef GM INHERITED; SkBitmap fCheckerboard; bool fInitialized; }; ////////////////////////////////////////////////////////////////////////////// static GM* MyFactory(void*) { return new BicubicGM; } static GMRegistry reg(MyFactory); }