BlurRectBench.cpp revision cb88d32b9fb3921529d1e46422daa65dbea0165d
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright 2013 Google Inc. 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * found in the LICENSE file. 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "SkBenchmark.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "SkCanvas.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "SkPaint.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkRandom.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkShader.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkString.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkBlurMask.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define SMALL SkIntToScalar(2) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define REAL SkFloatToScalar(1.5f) 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define BIG SkIntToScalar(10) 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define REALBIG SkFloatToScalar(30.5f) 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BlurRectBench: public SkBenchmark { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkScalar fRadius; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkString fName; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public: 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BlurRectBench(void *param, SkScalar rad) : INHERITED(param) { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fRadius = rad; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)protected: 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const char* onGetName() { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return fName.c_str(); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkScalar radius() const { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return fRadius; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void setName(const SkString& name) { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fName = name; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void onDraw(SkCanvas* canvas) { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this->setupPaint(&paint); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint.setAntiAlias(true); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkScalar pad = fRadius*3/2 + SK_Scalar1; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkRect r = SkRect::MakeWH(2 * pad + SK_Scalar1, 2 * pad + SK_Scalar1); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int loop_count; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (fRadius > SkIntToScalar(50)) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop_count = 10; 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (fRadius > SkIntToScalar(5)) { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop_count = 1000; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loop_count = 10000; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) preBenchSetup(r); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i < SkBENCHLOOP(loop_count); i++) { 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) makeBlurryRect(r); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void makeBlurryRect(const SkRect&) = 0; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void preBenchSetup(const SkRect&) {} 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)private: 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef SkBenchmark INHERITED; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class BlurRectDirectBench: public BlurRectBench { 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BlurRectDirectBench(void *param, SkScalar rad) : BlurRectBench(param, rad) { 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkString name; 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (SkScalarFraction(rad) != 0) { 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad)); 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) name.printf("blurrect_direct_%d", SkScalarRound(rad)); 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) setName(name); 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)protected: 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE { 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkMask mask; 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style, 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBlurMask::kHigh_Quality); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BlurRectSeparableBench: public BlurRectBench { 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkMask fSrcMask; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench(param, rad) { 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkString name; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (SkScalarFraction(rad) != 0) { 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad)); 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name.printf("blurrect_separable_%d", SkScalarRound(rad)); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) setName(name); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)protected: 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE { 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) r.roundOut(&fSrcMask.fBounds); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fSrcMask.fFormat = SkMask::kA8_Format; 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fSrcMask.fRowBytes = fSrcMask.fBounds.width(); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize()); 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize()); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE { 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkMask mask; 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(), 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkBlurMask::kNormal_Style, 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkBlurMask::kHigh_Quality); 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, SMALL);) 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, BIG);) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);) 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, REAL);) 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, SMALL);) 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, BIG);) 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, REALBIG);) 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, REAL);) 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)