1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
10f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkBlurMaskFilter.h"
1125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkCanvas.h"
1225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkPaint.h"
1325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkRandom.h"
1425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkShader.h"
1525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkString.h"
1625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
1725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#define SMALL   SkIntToScalar(2)
184b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define REAL    1.5f
1925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#define BIG     SkIntToScalar(10)
204b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define REALBIG 100.5f
2125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
2225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comstatic const char* gStyleName[] = {
2325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "normal",
2425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "solid",
2525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "outer",
2625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "inner"
2725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com};
2825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
29f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BlurBench : public Benchmark {
3025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    SkScalar    fRadius;
31e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle fStyle;
32e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    uint32_t    fFlags;
3325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    SkString    fName;
3425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
3525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.compublic:
36e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    BlurBench(SkScalar rad, SkBlurStyle bs, uint32_t flags = 0) {
3725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        fRadius = rad;
3825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        fStyle = bs;
3991f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org        fFlags = flags;
4025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        const char* name = rad > 0 ? gStyleName[bs] : "none";
41b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com        const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality"
42b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                                                              : "low_quality";
438caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        if (SkScalarFraction(rad) != 0) {
4491f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org            fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
458caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        } else {
46e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com            fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality);
478caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        }
4825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
49fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
5025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comprotected:
5125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    virtual const char* onGetName() {
5225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        return fName.c_str();
5325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
54fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
5625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        SkPaint paint;
5725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        this->setupPaint(&paint);
5825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
5925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        paint.setAntiAlias(true);
6025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
61e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
623361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
6325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
6425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                                      rand.nextUScalar1() * 400);
6525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            r.offset(fRadius, fRadius);
6625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
6725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            if (fRadius > 0) {
68b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                SkMaskFilter* mf = SkBlurMaskFilter::Create(fStyle,
69b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                                            SkBlurMask::ConvertRadiusToSigma(fRadius),
70b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                            fFlags);
7125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                paint.setMaskFilter(mf)->unref();
7225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            }
7325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            canvas->drawOval(r, paint);
7425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        }
7525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
76fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
7725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comprivate:
78f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
7925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com};
8025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
81e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);)
82e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);)
83e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);)
84e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);)
85fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);)
87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);)
88e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);)
89e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);)
90fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
91e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);)
92e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);)
93e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);)
94e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);)
9591f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
96e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);)
97e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);)
98e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);)
99e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);)
100fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
101e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
10291f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
103e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
10491f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
105e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
10691f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
107e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
10891f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
109e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);)
110