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 "Benchmark.h" 9 #include "SkBlurMask.h" 10 #include "SkCanvas.h" 11 #include "SkPaint.h" 12 #include "SkRandom.h" 13 #include "SkShader.h" 14 #include "SkString.h" 15 16 class BitmapScaleBench: public Benchmark { 17 int fLoopCount; 18 int fInputSize; 19 int fOutputSize; 20 SkString fName; 21 22 public: BitmapScaleBench(int is,int os)23 BitmapScaleBench( int is, int os) { 24 fInputSize = is; 25 fOutputSize = os; 26 27 fLoopCount = 20; 28 } 29 30 protected: 31 32 SkBitmap fInputBitmap, fOutputBitmap; 33 SkMatrix fMatrix; 34 onGetName()35 virtual const char* onGetName() { 36 return fName.c_str(); 37 } 38 inputSize() const39 int inputSize() const { 40 return fInputSize; 41 } 42 outputSize() const43 int outputSize() const { 44 return fOutputSize; 45 } 46 scale() const47 float scale() const { 48 return float(outputSize())/inputSize(); 49 } 50 onGetSize()51 SkIPoint onGetSize() override { 52 return SkIPoint::Make( fOutputSize, fOutputSize ); 53 } 54 setName(const char * name)55 void setName(const char * name) { 56 fName.printf( "bitmap_scale_%s_%d_%d", name, fInputSize, fOutputSize ); 57 } 58 onPreDraw()59 virtual void onPreDraw() { 60 fInputBitmap.allocN32Pixels(fInputSize, fInputSize, true); 61 fInputBitmap.eraseColor(SK_ColorWHITE); 62 63 fOutputBitmap.allocN32Pixels(fOutputSize, fOutputSize, true); 64 65 fMatrix.setScale( scale(), scale() ); 66 } 67 onDraw(const int loops,SkCanvas *)68 virtual void onDraw(const int loops, SkCanvas*) { 69 SkPaint paint; 70 this->setupPaint(&paint); 71 72 preBenchSetup(); 73 74 for (int i = 0; i < loops; i++) { 75 doScaleImage(); 76 } 77 } 78 79 virtual void doScaleImage() = 0; preBenchSetup()80 virtual void preBenchSetup() {} 81 private: 82 typedef Benchmark INHERITED; 83 }; 84 85 class BitmapFilterScaleBench: public BitmapScaleBench { 86 public: BitmapFilterScaleBench(int is,int os)87 BitmapFilterScaleBench( int is, int os) : INHERITED(is, os) { 88 setName( "filter" ); 89 } 90 protected: doScaleImage()91 void doScaleImage() override { 92 SkCanvas canvas( fOutputBitmap ); 93 SkPaint paint; 94 95 paint.setFilterQuality(kHigh_SkFilterQuality); 96 fInputBitmap.notifyPixelsChanged(); 97 canvas.concat(fMatrix); 98 canvas.drawBitmap(fInputBitmap, 0, 0, &paint ); 99 } 100 private: 101 typedef BitmapScaleBench INHERITED; 102 }; 103 104 DEF_BENCH(return new BitmapFilterScaleBench(10, 90);) 105 DEF_BENCH(return new BitmapFilterScaleBench(30, 90);) 106 DEF_BENCH(return new BitmapFilterScaleBench(80, 90);) 107 DEF_BENCH(return new BitmapFilterScaleBench(90, 90);) 108 DEF_BENCH(return new BitmapFilterScaleBench(90, 80);) 109 DEF_BENCH(return new BitmapFilterScaleBench(90, 30);) 110 DEF_BENCH(return new BitmapFilterScaleBench(90, 10);) 111 DEF_BENCH(return new BitmapFilterScaleBench(256, 64);) 112 DEF_BENCH(return new BitmapFilterScaleBench(64, 256);) 113