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