BlurRoundRectBench.cpp revision 6c1e49af8de1f6dfdc5fb09cd0edfc2e469e945f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Copyright 2013 Google Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkBenchmark.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkBlurMask.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkBlurMaskFilter.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkColorFilter.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkLayerDrawLooper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPaint.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPath.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPoint.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkRect.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkRRect.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkString.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkXfermode.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Large blurred RR appear frequently on web pages. This benchmark measures our
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// performance in this case.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlurRoundRectBench : public SkBenchmark {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlurRoundRectBench(int width, int height, int cornerRadius)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : fName("blurroundrect") {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual const char* onGetName() SK_OVERRIDE {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return fName.c_str();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkIPoint onGetSize() SK_OVERRIDE {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SkScalarCeilToInt(fRRect.rect().height()));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkLayerDrawLooper::LayerInfo info;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.fFlagsMask = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              | SkLayerDrawLooper::kColorFilter_Bit;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.fColorMode = SkXfermode::kSrc_Mode;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.fPostTranslate = false;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkPaint* paint = looper->addLayerOnTop(info);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SkBlurMaskFilter::kNormal_BlurStyle,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SkBlurMaskFilter::kHighQuality_BlurFlag);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            paint->setMaskFilter(maskFilter)->unref();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SkXfermode::kSrcIn_Mode);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            paint->setColorFilter(colorFilter)->unref();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            paint->setColor(SK_ColorGRAY);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkLayerDrawLooper::LayerInfo info;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            looper->addLayerOnTop(info);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkPaint dullPaint;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dullPaint.setAntiAlias(true);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkPaint loopedPaint;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loopedPaint.setLooper(looper)->unref();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loopedPaint.setAntiAlias(true);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loopedPaint.setColor(SK_ColorCYAN);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int i = 0; i < this->getLoops(); i++) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            canvas->drawRect(fRRect.rect(), dullPaint);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            canvas->drawRRect(fRRect, loopedPaint);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkString    fName;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkRRect     fRRect;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef     SkBenchmark INHERITED;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create one with dimensions/rounded corners based on the skp
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same radii, much smaller rectangle
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEF_BENCH(return new BlurRoundRectBench(100, 100, 6);)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Other radii options
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEF_BENCH(return new BlurRoundRectBench(100, 100, 30);)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEF_BENCH(return new BlurRoundRectBench(100, 100, 90);)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)