1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkMaskFilter.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 11cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 12cb93a386Sopenharmony_ci#include "include/core/SkString.h" 13cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 14cb93a386Sopenharmony_ci#include "src/core/SkBlurMask.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci#define MINI 0.01f 17cb93a386Sopenharmony_ci#define SMALL SkIntToScalar(2) 18cb93a386Sopenharmony_ci#define REAL 0.5f 19cb93a386Sopenharmony_ci#define BIG SkIntToScalar(10) 20cb93a386Sopenharmony_ci#define REALBIG 100.5f 21cb93a386Sopenharmony_ci// The value that produces a sigma of just over 2. 22cb93a386Sopenharmony_ci#define CUTOVER 2.6f 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cistatic const char* gStyleName[] = { 25cb93a386Sopenharmony_ci "normal", 26cb93a386Sopenharmony_ci "solid", 27cb93a386Sopenharmony_ci "outer", 28cb93a386Sopenharmony_ci "inner" 29cb93a386Sopenharmony_ci}; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciclass BlurBench : public Benchmark { 32cb93a386Sopenharmony_ci SkScalar fRadius; 33cb93a386Sopenharmony_ci SkBlurStyle fStyle; 34cb93a386Sopenharmony_ci SkString fName; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_cipublic: 37cb93a386Sopenharmony_ci BlurBench(SkScalar rad, SkBlurStyle bs) { 38cb93a386Sopenharmony_ci fRadius = rad; 39cb93a386Sopenharmony_ci fStyle = bs; 40cb93a386Sopenharmony_ci const char* name = rad > 0 ? gStyleName[bs] : "none"; 41cb93a386Sopenharmony_ci const char* quality = "high_quality"; 42cb93a386Sopenharmony_ci if (SkScalarFraction(rad) != 0) { 43cb93a386Sopenharmony_ci fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality); 44cb93a386Sopenharmony_ci } else { 45cb93a386Sopenharmony_ci fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ciprotected: 50cb93a386Sopenharmony_ci const char* onGetName() override { 51cb93a386Sopenharmony_ci return fName.c_str(); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 55cb93a386Sopenharmony_ci SkPaint paint; 56cb93a386Sopenharmony_ci this->setupPaint(&paint); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci paint.setAntiAlias(true); 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci SkRandom rand; 61cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 62cb93a386Sopenharmony_ci SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, 63cb93a386Sopenharmony_ci rand.nextUScalar1() * 400); 64cb93a386Sopenharmony_ci r.offset(fRadius, fRadius); 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci if (fRadius > 0) { 67cb93a386Sopenharmony_ci paint.setMaskFilter(SkMaskFilter::MakeBlur(fStyle, 68cb93a386Sopenharmony_ci SkBlurMask::ConvertRadiusToSigma(fRadius))); 69cb93a386Sopenharmony_ci } 70cb93a386Sopenharmony_ci canvas->drawOval(r, paint); 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciprivate: 75cb93a386Sopenharmony_ci using INHERITED = Benchmark; 76cb93a386Sopenharmony_ci}; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle);) 79cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(MINI, kSolid_SkBlurStyle);) 80cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(MINI, kOuter_SkBlurStyle);) 81cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(MINI, kInner_SkBlurStyle);) 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);) 84cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);) 85cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);) 86cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);) 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);) 89cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);) 90cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);) 91cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);) 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);) 94cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);) 95cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);) 96cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);) 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);) 99cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);) 100cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);) 101cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);) 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ciDEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);) 104