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