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 "SkBicubicImageFilter.h"
10#include "SkCanvas.h"
11#include "SkShader.h"
12#include "SkString.h"
13
14// This bench exercises SkBicubicImageFilter, upsampling a 40x40 input to
15// 100x100, 400x100, 100x400, and 400x400.
16
17class BicubicBench : public Benchmark {
18    SkSize         fScale;
19    SkString       fName;
20
21public:
22    BicubicBench(float x, float y)
23        : fScale(SkSize::Make(x, y)) {
24        fName.printf("bicubic_%gx%g",
25                     SkScalarToFloat(fScale.fWidth), SkScalarToFloat(fScale.fHeight));
26    }
27
28protected:
29    virtual const char* onGetName() {
30        return fName.c_str();
31    }
32
33    virtual void onDraw(const int loops, SkCanvas* canvas) {
34        SkPaint paint;
35        this->setupPaint(&paint);
36
37        paint.setAntiAlias(true);
38
39        SkRect r = SkRect::MakeWH(40, 40);
40        SkAutoTUnref<SkImageFilter> bicubic(SkBicubicImageFilter::CreateMitchell(fScale));
41        paint.setImageFilter(bicubic);
42
43        for (int i = 0; i < loops; i++) {
44            canvas->save();
45            canvas->clipRect(r);
46            canvas->drawOval(r, paint);
47            canvas->restore();
48        }
49    }
50
51private:
52    typedef Benchmark INHERITED;
53};
54
55DEF_BENCH( return new BicubicBench(10.0f, 10.0f); )
56DEF_BENCH( return new BicubicBench(2.5f, 10.0f); )
57DEF_BENCH( return new BicubicBench(10.0f, 2.5f); )
58DEF_BENCH( return new BicubicBench(2.5f, 2.5f); )
59