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