158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/* 258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Copyright 2013 Google Inc. 358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * 458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * found in the LICENSE file. 658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkBenchmark.h" 958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkCanvas.h" 1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkPaint.h" 1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkRandom.h" 1258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkShader.h" 1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkString.h" 1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkBlurMask.h" 1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 1658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass BitmapScaleBench: public SkBenchmark { 1758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int fLoopCount; 1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int fInputSize; 1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int fOutputSize; 2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkString fName; 2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic: 230a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger BitmapScaleBench( int is, int os) { 2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fInputSize = is; 2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fOutputSize = os; 2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fLoopCount = 20; 2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprotected: 3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkBitmap fInputBitmap, fOutputBitmap; 3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkMatrix fMatrix; 3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual const char* onGetName() { 3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return fName.c_str(); 3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int inputSize() const { 4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return fInputSize; 4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int outputSize() const { 4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return fOutputSize; 4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger float scale() const { 4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return float(outputSize())/inputSize(); 4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkIPoint onGetSize() SK_OVERRIDE { 5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return SkIPoint::Make( fOutputSize, fOutputSize ); 5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void setName(const char * name) { 5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fName.printf( "bitmap_scale_%s_%d_%d", name, fInputSize, fOutputSize ); 5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void onPreDraw() { 600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fInputBitmap.setConfig(SkBitmap::kARGB_8888_Config, 610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fInputSize, fInputSize, 0, kOpaque_SkAlphaType); 6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fInputBitmap.allocPixels(); 6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fInputBitmap.eraseColor(SK_ColorWHITE); 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fOutputBitmap.setConfig(SkBitmap::kARGB_8888_Config, 660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fOutputSize, fOutputSize, 0, kOpaque_SkAlphaType); 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fOutputBitmap.allocPixels(); 6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fMatrix.setScale( scale(), scale() ); 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 72910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas*) { 7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkPaint paint; 7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger this->setupPaint(&paint); 7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger preBenchSetup(); 7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 78910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger for (int i = 0; i < loops; i++) { 7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger doScaleImage(); 8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void doScaleImage() = 0; 8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void preBenchSetup() {} 8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate: 8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger typedef SkBenchmark INHERITED; 8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}; 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass BitmapFilterScaleBench: public BitmapScaleBench { 9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger public: 910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger BitmapFilterScaleBench( int is, int os) : INHERITED(is, os) { 9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger setName( "filter" ); 9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprotected: 9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void doScaleImage() SK_OVERRIDE { 9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkCanvas canvas( fOutputBitmap ); 9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkPaint paint; 9858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 9958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger paint.setFilterLevel(SkPaint::kHigh_FilterLevel); 10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); 10158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate: 10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger typedef BitmapScaleBench INHERITED; 10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}; 10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(10, 90);) 1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(30, 90);) 1080a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(80, 90);) 1090a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(90, 90);) 1100a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(90, 80);) 1110a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(90, 30);) 1120a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(90, 10);) 1130a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(256, 64);) 1140a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH(return new BitmapFilterScaleBench(64, 256);) 115