BlurRectBench.cpp revision 7c7292c6071898d73dc935c3b66b9816183806f0
17c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 27c7292c6071898d73dc935c3b66b9816183806f0humper@google.com/* 37c7292c6071898d73dc935c3b66b9816183806f0humper@google.com * Copyright 2013 Google Inc. 47c7292c6071898d73dc935c3b66b9816183806f0humper@google.com * 57c7292c6071898d73dc935c3b66b9816183806f0humper@google.com * Use of this source code is governed by a BSD-style license that can be 67c7292c6071898d73dc935c3b66b9816183806f0humper@google.com * found in the LICENSE file. 77c7292c6071898d73dc935c3b66b9816183806f0humper@google.com */ 87c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkBenchmark.h" 97c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkCanvas.h" 107c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkPaint.h" 117c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkRandom.h" 127c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkShader.h" 137c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkString.h" 147c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkBlurMask.h" 157c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 167c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#define SMALL SkIntToScalar(2) 177c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#define REAL SkFloatToScalar(1.5f) 187c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#define BIG SkIntToScalar(10) 197c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#define REALBIG SkFloatToScalar(30.5f) 207c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 217c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectBench: public SkBenchmark { 227c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkScalar fRadius; 237c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkString fName; 247c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 257c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic: 267c7292c6071898d73dc935c3b66b9816183806f0humper@google.com BlurRectBench(void *param, SkScalar rad) : INHERITED(param) { 277c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fRadius = rad; 287c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 297c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 307c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 317c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual const char* onGetName() { 327c7292c6071898d73dc935c3b66b9816183806f0humper@google.com return fName.c_str(); 337c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 347c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 357c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkScalar radius() const { 367c7292c6071898d73dc935c3b66b9816183806f0humper@google.com return fRadius; 377c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 387c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 397c7292c6071898d73dc935c3b66b9816183806f0humper@google.com void setName( SkString name ) { 407c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fName = name; 417c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 427c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 437c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void onDraw(SkCanvas* canvas) { 447c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkPaint paint; 457c7292c6071898d73dc935c3b66b9816183806f0humper@google.com this->setupPaint(&paint); 467c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 477c7292c6071898d73dc935c3b66b9816183806f0humper@google.com paint.setAntiAlias(true); 487c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 497c7292c6071898d73dc935c3b66b9816183806f0humper@google.com int pad = fRadius * 1.5 + 1; 507c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkRect r = SkRect::MakeWH(2 * pad + 1, 2 * pad + 1); 517c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 527c7292c6071898d73dc935c3b66b9816183806f0humper@google.com int loop_count; 537c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 547c7292c6071898d73dc935c3b66b9816183806f0humper@google.com if (fRadius > SkIntToScalar(50)) { 557c7292c6071898d73dc935c3b66b9816183806f0humper@google.com loop_count = 10; 567c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } else if (fRadius > SkIntToScalar(5)) { 577c7292c6071898d73dc935c3b66b9816183806f0humper@google.com loop_count = 1000; 587c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } else { 597c7292c6071898d73dc935c3b66b9816183806f0humper@google.com loop_count = 10000; 607c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 617c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 627c7292c6071898d73dc935c3b66b9816183806f0humper@google.com preBenchSetup( r ); 637c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 647c7292c6071898d73dc935c3b66b9816183806f0humper@google.com for (int i = 0; i < SkBENCHLOOP(loop_count); i++) { 657c7292c6071898d73dc935c3b66b9816183806f0humper@google.com makeBlurryRect( r ); 667c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 677c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 687c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 697c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void makeBlurryRect( SkRect &r ) = 0; 707c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void preBenchSetup( SkRect &r ) {} 717c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprivate: 727c7292c6071898d73dc935c3b66b9816183806f0humper@google.com typedef SkBenchmark INHERITED; 737c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 747c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 757c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 767c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectDirectBench: public BlurRectBench { 777c7292c6071898d73dc935c3b66b9816183806f0humper@google.com public: 787c7292c6071898d73dc935c3b66b9816183806f0humper@google.com BlurRectDirectBench( void *param, SkScalar rad ) : BlurRectBench( param, rad ) { 797c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkString name; 807c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 817c7292c6071898d73dc935c3b66b9816183806f0humper@google.com if (SkScalarFraction(rad) != 0) { 827c7292c6071898d73dc935c3b66b9816183806f0humper@google.com name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad)); 837c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } else { 847c7292c6071898d73dc935c3b66b9816183806f0humper@google.com name.printf("blurrect_direct_%d", SkScalarRound(rad)); 857c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 867c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 877c7292c6071898d73dc935c3b66b9816183806f0humper@google.com setName( name ); 887c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 897c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 907c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void makeBlurryRect( SkRect &r ) { 917c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkMask mask; 927c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkBlurMask::BlurRect( &mask, r, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 937c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 947c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 957c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 967c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectSeparableBench: public BlurRectBench { 977c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkMask fSrcMask; 987c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic: 997c7292c6071898d73dc935c3b66b9816183806f0humper@google.com BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench( param, rad ) { 1007c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkString name; 1017c7292c6071898d73dc935c3b66b9816183806f0humper@google.com if (SkScalarFraction(rad) != 0) { 1027c7292c6071898d73dc935c3b66b9816183806f0humper@google.com name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad)); 1037c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } else { 1047c7292c6071898d73dc935c3b66b9816183806f0humper@google.com name.printf("blurrect_separable_%d", SkScalarRound(rad)); 1057c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 1067c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 1077c7292c6071898d73dc935c3b66b9816183806f0humper@google.com setName( name ); 1087c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 1097c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 1107c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 1117c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void preBenchSetup( SkRect &r ) { 1127c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fSrcMask.fFormat = SkMask::kA8_Format; 1137c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fSrcMask.fRowBytes = r.width(); 1147c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fSrcMask.fBounds = SkIRect::MakeWH(r.width(), r.height()); 1157c7292c6071898d73dc935c3b66b9816183806f0humper@google.com fSrcMask.fImage = SkMask::AllocImage( fSrcMask.computeTotalImageSize() ); 1167c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 1177c7292c6071898d73dc935c3b66b9816183806f0humper@google.com memset( fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize() ); 1187c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 1197c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 1207c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void makeBlurryRect( SkRect &r ) { 1217c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkMask mask; 1227c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkBlurMask::BlurSeparable( &mask, fSrcMask, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality ); 1237c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 1247c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 1257c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 1267c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectSeparableBench(p, SMALL);) 1277c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectSeparableBench(p, BIG);) 1287c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);) 1297c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectSeparableBench(p, REAL);) 1307c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectDirectBench(p, SMALL);) 1317c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectDirectBench(p, BIG);) 1327c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectDirectBench(p, REALBIG);) 1337c7292c6071898d73dc935c3b66b9816183806f0humper@google.comDEF_BENCH(return new BlurRectDirectBench(p, REAL);) 134