BlurRoundRectBench.cpp revision 8610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer/*
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman* Copyright 2013 Google Inc.
36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke*
46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke* Use of this source code is governed by a BSD-style license that can be
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner* found in the LICENSE file.
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner*/
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBenchmark.h"
96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBlurMask.h"
106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkBlurMaskFilter.h"
116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkCanvas.h"
1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman#include "SkColorFilter.h"
139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkLayerDrawLooper.h"
149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPaint.h"
159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPath.h"
169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPoint.h"
176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkRect.h"
186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkRRect.h"
196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkString.h"
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "SkXfermode.h"
21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer
22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer// Large blurred RR appear frequently on web pages. This benchmark measures our
231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer// performance in this case.
246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass BlurRoundRectBench : public SkBenchmark {
256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekepublic:
266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    BlurRoundRectBench(int width, int height, int cornerRadius)
276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        : fName("blurroundrect") {
286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius);
296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius));
316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    virtual const char* onGetName() SK_OVERRIDE {
34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        return fName.c_str();
356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke    virtual SkIPoint onGetSize() SK_OVERRIDE {
38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()),
39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                              SkScalarCeilToInt(fRRect.rect().height()));
40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    }
41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        {
45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke            SkLayerDrawLooper::LayerInfo info;
466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            info.fFlagsMask = 0;
479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                              | SkLayerDrawLooper::kColorFilter_Bit;
499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            info.fColorMode = SkXfermode::kSrc_Mode;
509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            info.fPostTranslate = false;
529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            SkPaint* paint = looper->addLayerOnTop(info);
539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf,
549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                    SkBlurMaskFilter::kNormal_BlurStyle,
559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                    SkBlurMaskFilter::kHighQuality_BlurFlag);
569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            paint->setMaskFilter(maskFilter)->unref();
579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY,
589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                    SkXfermode::kSrcIn_Mode);
599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            paint->setColorFilter(colorFilter)->unref();
609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            paint->setColor(SK_ColorGRAY);
619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        }
626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        {
639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            SkLayerDrawLooper::LayerInfo info;
646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            looper->addLayerOnTop(info);
656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        }
666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        SkPaint dullPaint;
676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        dullPaint.setAntiAlias(true);
686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        SkPaint loopedPaint;
706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        loopedPaint.setLooper(looper)->unref();
716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        loopedPaint.setAntiAlias(true);
726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        loopedPaint.setColor(SK_ColorCYAN);
736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        for (int i = 0; i < this->getLoops(); i++) {
756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            canvas->drawRect(fRRect.rect(), dullPaint);
766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            canvas->drawRRect(fRRect, loopedPaint);
77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson        }
78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson    }
796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonprivate:
819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    SkString    fName;
826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    SkRRect     fRRect;
836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke    typedef     SkBenchmark INHERITED;
85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke};
86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke
879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Create one with dimensions/rounded corners based on the skp
88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. SpencerDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);)
89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer// Same radii, much smaller rectangle
90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. SpencerDEF_BENCH(return new BlurRoundRectBench(100, 100, 6);)
91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// Other radii options
92620ee02353d8b65959dc01a66b073adfcdef9eacBrian GaekeDEF_BENCH(return new BlurRoundRectBench(100, 100, 30);)
93620ee02353d8b65959dc01a66b073adfcdef9eacBrian GaekeDEF_BENCH(return new BlurRoundRectBench(100, 100, 90);)
94c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer