1b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com/*
2b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * Copyright 2013 Google Inc.
3b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com *
4b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * Use of this source code is governed by a BSD-style license that can be
5b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * found in the LICENSE file.
6b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com */
7b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkBlurMask.h"
10b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkCanvas.h"
11b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkPaint.h"
12b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkRandom.h"
13b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkShader.h"
14b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkString.h"
15b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
16f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapScaleBench: public Benchmark {
17b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    int         fLoopCount;
18b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    int         fInputSize;
19b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    int         fOutputSize;
20b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    SkString    fName;
21b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
22b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.compublic:
23410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BitmapScaleBench( int is, int os)  {
24b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        fInputSize = is;
25b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        fOutputSize = os;
26b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
27523521c6bc4b96b0839da65451960d84c4dfde2ahumper@google.com        fLoopCount = 20;
28b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
29b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
30b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprotected:
319e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
32b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    SkBitmap fInputBitmap, fOutputBitmap;
33b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    SkMatrix fMatrix;
349e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
35b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    virtual const char* onGetName() {
36b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        return fName.c_str();
37b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
38b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
39b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    int inputSize() const {
40b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        return fInputSize;
41b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
429e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
43b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    int outputSize() const {
44b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        return fOutputSize;
45b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
469e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
47b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    float scale() const {
48b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        return float(outputSize())/inputSize();
49b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
509e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
51b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    SkIPoint onGetSize() SK_OVERRIDE {
52b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        return SkIPoint::Make( fOutputSize, fOutputSize );
53b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
54b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
55b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    void setName(const char * name) {
56b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        fName.printf( "bitmap_scale_%s_%d_%d", name, fInputSize, fOutputSize );
57b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
589e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
59b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    virtual void onPreDraw() {
606c22573edb234ad14df947278cfed010669a39a7reed        fInputBitmap.allocN32Pixels(fInputSize, fInputSize, true);
61b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        fInputBitmap.eraseColor(SK_ColorWHITE);
629e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
636c22573edb234ad14df947278cfed010669a39a7reed        fOutputBitmap.allocN32Pixels(fOutputSize, fOutputSize, true);
649e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
65b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        fMatrix.setScale( scale(), scale() );
66b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
67b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
683361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
69b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        SkPaint paint;
70b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        this->setupPaint(&paint);
71b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
72b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        preBenchSetup();
73b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
75b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com            doScaleImage();
76b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        }
77b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
78b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
79b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    virtual void doScaleImage() = 0;
80b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    virtual void preBenchSetup() {}
81b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprivate:
82f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
83b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com};
84b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
85b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comclass BitmapFilterScaleBench: public BitmapScaleBench {
86b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com public:
87410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BitmapFilterScaleBench( int is, int os) : INHERITED(is, os) {
88b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        setName( "filter" );
89b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
90b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprotected:
91b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    virtual void doScaleImage() SK_OVERRIDE {
92b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        SkCanvas canvas( fOutputBitmap );
93b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        SkPaint paint;
949e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com
959cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
961b28f6f1ce3de9bc5ef1182e94df11f9f5610913commit-bot@chromium.org        fInputBitmap.notifyPixelsChanged();
97b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com        canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint );
98b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    }
99b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprivate:
100b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com    typedef BitmapScaleBench INHERITED;
101b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com};
102b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com
103410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(10, 90);)
104410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(30, 90);)
105410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(80, 90);)
106410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 90);)
107410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 80);)
108410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 30);)
109410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 10);)
110410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(256, 64);)
111410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(64, 256);)
112