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
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.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 "SkRRect.h"
18f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkRect.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.
24f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BlurRoundRectBench : public Benchmark {
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
423361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
4373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        SkLayerDrawLooper::Builder looperBuilder;
448610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        {
458610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            SkLayerDrawLooper::LayerInfo info;
468610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
478610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com                              | SkLayerDrawLooper::kColorFilter_Bit;
488610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fColorMode = SkXfermode::kSrc_Mode;
498610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
508610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com            info.fPostTranslate = false;
5173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org            SkPaint* paint = looperBuilder.addLayerOnTop(info);
526c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(
53e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                    kNormal_SkBlurStyle,
546c1e49af8de1f6dfdc5fb09cd0edfc2e469e945frobertphillips@google.com                    SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf),
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;
6473cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org            looperBuilder.addLayerOnTop(info);
658610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        }
668610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkPaint dullPaint;
678610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        dullPaint.setAntiAlias(true);
687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
698610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        SkPaint loopedPaint;
7073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org        loopedPaint.setLooper(looperBuilder.detachLooper())->unref();
718610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        loopedPaint.setAntiAlias(true);
728610d2cdbdcc0e1cf28f9a1ffea0ebab53a33485scroggo@google.com        loopedPaint.setColor(SK_ColorCYAN);
737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; 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
84f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef     Benchmark 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