1c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org/*
2c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org * Copyright 2013 Google Inc.
3c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org *
4c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org * found in the LICENSE file.
6c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org */
7c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkBicubicImageFilter.h"
10c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org#include "SkCanvas.h"
11c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org#include "SkShader.h"
12c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org#include "SkString.h"
13c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
14c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org// This bench exercises SkBicubicImageFilter, upsampling a 40x40 input to
15c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org// 100x100, 400x100, 100x400, and 400x400.
16c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
17f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BicubicBench : public Benchmark {
18c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    SkSize         fScale;
19c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    SkString       fName;
20c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
21c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.orgpublic:
22410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BicubicBench(float x, float y)
234b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        : fScale(SkSize::Make(x, y)) {
24c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        fName.printf("bicubic_%gx%g",
25410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com                     SkScalarToFloat(fScale.fWidth), SkScalarToFloat(fScale.fHeight));
26c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    }
27c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
28c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.orgprotected:
29c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    virtual const char* onGetName() {
30c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        return fName.c_str();
31c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    }
32c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
34c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        SkPaint paint;
35c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        this->setupPaint(&paint);
36c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
37c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        paint.setAntiAlias(true);
38c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
39c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        SkRect r = SkRect::MakeWH(40, 40);
40c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        SkAutoTUnref<SkImageFilter> bicubic(SkBicubicImageFilter::CreateMitchell(fScale));
41c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org        paint.setImageFilter(bicubic);
42c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
433361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
44c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->save();
45c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->clipRect(r);
46c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->drawOval(r, paint);
47c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->restore();
48c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        }
49c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org    }
50c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
51c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.orgprivate:
52f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
53c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org};
54c3799ada5b291000b2adde57cc0fee734fd7e232senorblanco@chromium.org
55410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new BicubicBench(10.0f, 10.0f); )
56410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new BicubicBench(2.5f, 10.0f); )
57410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new BicubicBench(10.0f, 2.5f); )
58410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new BicubicBench(2.5f, 2.5f); )
59