BlurRoundRectBench.cpp revision 7b0565907272bfe6682b09a36f7a8fef85e0f73d
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
227b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comclass BlurRoundRectBench : public SkBenchmark {
237b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.compublic:
247b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    BlurRoundRectBench(int width, int height,
257b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       // X and Y radii for the upper left corner
267b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       int ulX, int ulY,
277b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       // X and Y radii for the upper right corner
287b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       int urX, int urY,
297b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       // X and Y radii for the lower right corner
307b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       int lrX, int lrY,
317b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       // X and Y radii for the lower left corner
327b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                       int llX, int llY)
337b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        : fName("blurroundrect")
347b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        , fWidth(width)
357b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        , fHeight(height) {
367b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        fName.appendf("_WH[%ix%i]_UL[%ix%i]_UR[%ix%i]_LR[%ix%i]_LL[%ix%i]",
377b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                      width, height,
387b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                      ulX,   ulY,
397b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                      urX,   urY,
407b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                      lrX,   lrY,
417b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                      llX,   llY);
427b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        fRadii[0].set(SkIntToScalar(ulX), SkIntToScalar(ulY));
437b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        fRadii[1].set(SkIntToScalar(urX), SkIntToScalar(urY));
447b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        fRadii[2].set(SkIntToScalar(lrX), SkIntToScalar(lrY));
457b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        fRadii[3].set(SkIntToScalar(llX), SkIntToScalar(llY));
467b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
477b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
487b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual const char* onGetName() SK_OVERRIDE {
497b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        return fName.c_str();
507b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
517b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
527b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual SkIPoint onGetSize() SK_OVERRIDE {
537b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        return SkIPoint::Make(fWidth, fHeight);
547b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
557b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
567b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
577b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        for (int i = 0; i < this->getLoops(); i++) {
587b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            SkLayerDrawLooper* looper = new SkLayerDrawLooper;
597b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            {
607b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                SkLayerDrawLooper::LayerInfo info;
617b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                info.fFlagsMask = 0;
627b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                info.fPaintBits = 40;
637b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                info.fColorMode = SkXfermode::kSrc_Mode;
647b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
657b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                info.fPostTranslate = false;
667b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                SkPaint* paint = looper->addLayerOnTop(info);
677b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf,
687b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                        SkBlurMaskFilter::kNormal_BlurStyle,
697b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                        SkBlurMaskFilter::kHighQuality_BlurFlag);
707b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                paint->setMaskFilter(maskFilter)->unref();
717b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(4279308561,
727b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                        SkXfermode::kSrcIn_Mode);
737b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                paint->setColorFilter(colorFilter)->unref();
747b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                paint->setColor(4278190080);
757b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            }
767b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            {
777b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                SkLayerDrawLooper::LayerInfo info;
787b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com                looper->addLayerOnTop(info);
797b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            }
807b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            SkPaint paint;
817b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            SkRect rect = SkRect::MakeWH(fWidth, fHeight);
827b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            canvas->drawRect(rect, paint);
837b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
847b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            paint.setLooper(looper)->unref();
857b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            paint.setColor(4293848814);
867b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            paint.setAntiAlias(true);
877b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
887b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            SkRRect rrect;
897b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            rrect.setRectRadii(rect, fRadii);
907b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com            canvas->drawRRect(rrect, paint);
917b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com        }
927b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    }
937b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
947b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comprivate:
957b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    SkString fName;
967b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    const int fWidth;
977b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    const int fHeight;
987b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    SkVector fRadii[4];
997b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com    typedef SkBenchmark INHERITED;
1007b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com};
1017b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com
1027b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Create one with dimensions/rounded corners based on the skp
1037b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(600, 5514, 6, 6, 6, 6, 6, 6, 6, 6);)
1047b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Same radii, much smaller rectangle
1057b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 6, 6, 6, 6, 6, 6, 6, 6);)
1067b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// Rounded rect with two opposite corners with large radii, the other two
1077b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.com// small.
1087b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 30, 30, 10, 10, 30, 30, 10, 10);)
1097b0565907272bfe6682b09a36f7a8fef85e0f73dscroggo@google.comDEF_BENCH(return new BlurRoundRectBench(100, 100, 90, 90, 90, 90, 90, 90, 90, 90);)
110