1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
8b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkBlurMaskFilter.h"
1025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkCanvas.h"
1125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkPaint.h"
1225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkRandom.h"
1325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkShader.h"
1425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#include "SkString.h"
1525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
165acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt#define MINI   0.01f
1725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#define SMALL   SkIntToScalar(2)
1835c556f33e2c9316055537e5683c28ea1645ff49Herb Derby#define REAL    0.5f
1925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com#define BIG     SkIntToScalar(10)
204b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define REALBIG 100.5f
2135c556f33e2c9316055537e5683c28ea1645ff49Herb Derby// The value that produces a sigma of just over 2.
2235c556f33e2c9316055537e5683c28ea1645ff49Herb Derby#define CUTOVER 2.6f
2325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
2425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comstatic const char* gStyleName[] = {
2525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "normal",
2625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "solid",
2725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "outer",
2825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    "inner"
2925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com};
3025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
31f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BlurBench : public Benchmark {
3225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    SkScalar    fRadius;
33e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle fStyle;
34e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    uint32_t    fFlags;
3525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    SkString    fName;
3625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
3725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.compublic:
38e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    BlurBench(SkScalar rad, SkBlurStyle bs, uint32_t flags = 0) {
3925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        fRadius = rad;
4025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        fStyle = bs;
4191f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org        fFlags = flags;
4225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        const char* name = rad > 0 ? gStyleName[bs] : "none";
43b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com        const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality"
44b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                                                              : "low_quality";
458caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        if (SkScalarFraction(rad) != 0) {
4691f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org            fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
478caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        } else {
48e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com            fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality);
498caac6447dd68655b57dfe876626a9733b191416tomhudson@google.com        }
5025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
51fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
5225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comprotected:
5325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    virtual const char* onGetName() {
5425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        return fName.c_str();
5525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
56fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
57a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    virtual void onDraw(int loops, SkCanvas* canvas) {
5825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        SkPaint paint;
5925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        this->setupPaint(&paint);
6025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
6125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        paint.setAntiAlias(true);
6225df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
63e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
6525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
6625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com                                      rand.nextUScalar1() * 400);
6725df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            r.offset(fRadius, fRadius);
6825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
6925df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            if (fRadius > 0) {
70efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                paint.setMaskFilter(SkBlurMaskFilter::Make(fStyle,
71efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                          SkBlurMask::ConvertRadiusToSigma(fRadius),
72efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                          fFlags));
7325df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            }
7425df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com            canvas->drawOval(r, paint);
7525df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com        }
7625df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com    }
77fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
7825df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.comprivate:
79f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8025df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com};
8125df8884bb616f8acf1ddbfb15d800a215c5ac65reed@google.com
825acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle);)
835acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurBench(MINI, kSolid_SkBlurStyle);)
845acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurBench(MINI, kOuter_SkBlurStyle);)
855acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurBench(MINI, kInner_SkBlurStyle);)
865acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);)
88e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);)
89e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);)
90e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);)
91fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
92e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);)
93e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);)
94e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);)
95e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);)
96fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
97e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);)
98e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);)
99e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);)
100e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);)
10191f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
102e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);)
103e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);)
104e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);)
105e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);)
106fc5100af556b40411c71ac90b2af7b03bd88eddareed@google.com
1075acfea789d39106dbc706c6ee85cd8f027fce3edjoshualittDEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
1085acfea789d39106dbc706c6ee85cd8f027fce3edjoshualitt
109e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
11091f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
111e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
11291f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
113e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
11491f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
115e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
11635c556f33e2c9316055537e5683c28ea1645ff49Herb DerbyDEF_BENCH(return new BlurBench(CUTOVER, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
11791f489a65d436d36c7fe580af2775cd0cd13c8d2senorblanco@chromium.org
118e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.orgDEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);)
119