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