BlurRoundRectBench.cpp revision 8610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485
17b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com/*
27b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* Copyright 2013 Google Inc.
37b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com*
47b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* Use of this source code is governed by a BSD-style license that can be
57b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com* found in the LICENSE file.
67b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com*/
77b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
87b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkBenchmark.h"
97b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkBlurMask.h"
107b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkBlurMaskFilter.h"
117b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkCanvas.h"
127b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkColorFilter.h"
137b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkLayerDrawLooper.h"
147b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPaint.h"
157b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPath.h"
167b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkPoint.h"
177b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkRect.h"
187b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkRRect.h"
197b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkString.h"
207b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com#include "SkXfermode.h"
217b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
228610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// Large blurred RR appear frequently on web pages. This benchmark measures our
238610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// performance in this case.
247b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comclass BlurRoundRectBench : public SkBenchmark {
257b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic:
268610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com    BlurRoundRectBench(int width, int height, int cornerRadius)
278610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        : fName("blurroundrect") {
288610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius);
298610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
308610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius));
317b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
327b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
337b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual const char* onGetName() SK_OVERRIDE {
347b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        return fName.c_str();
357b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual SkIPoint onGetSize() SK_OVERRIDE {
388610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()),
398610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                              SkScalarCeilToInt(fRRect.rect().height()));
407b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
438610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
448610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        {
458610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkLayerDrawLooper::LayerInfo info;
468610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fFlagsMask = 0;
478610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
488610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                              | SkLayerDrawLooper::kColorFilter_Bit;
498610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fColorMode = SkXfermode::kSrc_Mode;
508610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
518610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fPostTranslate = false;
528610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkPaint* paint = looper->addLayerOnTop(info);
538610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf,
548610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                    SkBlurMaskFilter::kNormal_BlurStyle,
558610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                    SkBlurMaskFilter::kHighQuality_BlurFlag);
568610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            paint->setMaskFilter(maskFilter)->unref();
578610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY,
588610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                    SkXfermode::kSrcIn_Mode);
598610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            paint->setColorFilter(colorFilter)->unref();
608610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            paint->setColor(SK_ColorGRAY);
618610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        }
628610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        {
638610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkLayerDrawLooper::LayerInfo info;
648610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            looper->addLayerOnTop(info);
658610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        }
668610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkPaint dullPaint;
678610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        dullPaint.setAntiAlias(true);
687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
698610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkPaint loopedPaint;
708610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        loopedPaint.setLooper(looper)->unref();
718610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        loopedPaint.setAntiAlias(true);
728610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        loopedPaint.setColor(SK_ColorCYAN);
737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
748610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        for (int i = 0; i < this->getLoops(); i++) {
758610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            canvas->drawRect(fRRect.rect(), dullPaint);
768610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            canvas->drawRRect(fRRect, loopedPaint);
777b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        }
787b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
797b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
807b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate:
818610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com    SkString    fName;
828610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com    SkRRect     fRRect;
838610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com
848610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com    typedef     SkBenchmark INHERITED;
857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com};
867b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
877b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp
888610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);)
897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Same radii, much smaller rectangle
908610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 6);)
918610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com// Other radii options
928610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 30);)
938610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 90);)
94