Chromium Code Reviews| Index: bench/BlurRoundRectBench.cpp | 
| diff --git a/bench/BlurRoundRectBench.cpp b/bench/BlurRoundRectBench.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..486de3d4d01b69e2ac13a9370f7515802e0540bf | 
| --- /dev/null | 
| +++ b/bench/BlurRoundRectBench.cpp | 
| @@ -0,0 +1,109 @@ | 
| +/* | 
| +* Copyright 2013 Google Inc. | 
| +* | 
| +* Use of this source code is governed by a BSD-style license that can be | 
| +* found in the LICENSE file. | 
| +*/ | 
| + | 
| +#include "SkBenchmark.h" | 
| +#include "SkBlurMask.h" | 
| +#include "SkBlurMaskFilter.h" | 
| +#include "SkCanvas.h" | 
| +#include "SkColorFilter.h" | 
| +#include "SkLayerDrawLooper.h" | 
| +#include "SkPaint.h" | 
| +#include "SkPath.h" | 
| +#include "SkPoint.h" | 
| +#include "SkRect.h" | 
| +#include "SkRRect.h" | 
| +#include "SkString.h" | 
| +#include "SkXfermode.h" | 
| + | 
| 
 
robertphillips
2013/11/05 16:31:03
// Large blurred RR appear frequently on web pages
 
scroggo
2013/11/05 20:45:41
Done.
 
 | 
| +class BlurRoundRectBench : public SkBenchmark { | 
| +public: | 
| + BlurRoundRectBench(int width, int height, | 
| + // X and Y radii for the upper left corner | 
| + int ulX, int ulY, | 
| + // X and Y radii for the upper right corner | 
| + int urX, int urY, | 
| + // X and Y radii for the lower right corner | 
| + int lrX, int lrY, | 
| + // X and Y radii for the lower left corner | 
| + int llX, int llY) | 
| + : fName("blurroundrect") | 
| + , fWidth(width) | 
| + , fHeight(height) { | 
| + fName.appendf("_WH[%ix%i]_UL[%ix%i]_UR[%ix%i]_LR[%ix%i]_LL[%ix%i]", | 
| + width, height, | 
| + ulX, ulY, | 
| + urX, urY, | 
| + lrX, lrY, | 
| + llX, llY); | 
| + fRadii[0].set(SkIntToScalar(ulX), SkIntToScalar(ulY)); | 
| + fRadii[1].set(SkIntToScalar(urX), SkIntToScalar(urY)); | 
| + fRadii[2].set(SkIntToScalar(lrX), SkIntToScalar(lrY)); | 
| + fRadii[3].set(SkIntToScalar(llX), SkIntToScalar(llY)); | 
| + } | 
| + | 
| + virtual const char* onGetName() SK_OVERRIDE { | 
| + return fName.c_str(); | 
| + } | 
| + | 
| + virtual SkIPoint onGetSize() SK_OVERRIDE { | 
| + return SkIPoint::Make(fWidth, fHeight); | 
| + } | 
| + | 
| + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 
| 
 
robertphillips
2013/11/05 16:31:03
It seems like the paint/looper/etc. should be crea
 
scroggo
2013/11/05 20:45:41
Done.
 
 | 
| + for (int i = 0; i < this->getLoops(); i++) { | 
| + SkLayerDrawLooper* looper = new SkLayerDrawLooper; | 
| + { | 
| + SkLayerDrawLooper::LayerInfo info; | 
| + info.fFlagsMask = 0; | 
| 
 
robertphillips
2013/11/05 16:31:03
40?
 
scroggo
2013/11/05 20:45:41
Done.
 
 | 
| + info.fPaintBits = 40; | 
| + info.fColorMode = SkXfermode::kSrc_Mode; | 
| + info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); | 
| + info.fPostTranslate = false; | 
| + SkPaint* paint = looper->addLayerOnTop(info); | 
| + SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(SK_ScalarHalf, | 
| + SkBlurMaskFilter::kNormal_BlurStyle, | 
| + SkBlurMaskFilter::kHighQuality_BlurFlag); | 
| + paint->setMaskFilter(maskFilter)->unref(); | 
| 
 
robertphillips
2013/11/05 16:31:03
4279308561?
 
scroggo
2013/11/05 20:45:41
These were taken from the SKP. They also break war
 
 | 
| + SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(4279308561, | 
| + SkXfermode::kSrcIn_Mode); | 
| + paint->setColorFilter(colorFilter)->unref(); | 
| 
 
robertphillips
2013/11/05 16:31:03
4278190080?
 
scroggo
2013/11/05 20:45:41
same
 
 | 
| + paint->setColor(4278190080); | 
| + } | 
| + { | 
| + SkLayerDrawLooper::LayerInfo info; | 
| + looper->addLayerOnTop(info); | 
| + } | 
| + SkPaint paint; | 
| + SkRect rect = SkRect::MakeWH(fWidth, fHeight); | 
| + canvas->drawRect(rect, paint); | 
| + | 
| + paint.setLooper(looper)->unref(); | 
| 
 
robertphillips
2013/11/05 16:31:03
4293848814?
 
scroggo
2013/11/05 20:45:41
same
 
 | 
| + paint.setColor(4293848814); | 
| + paint.setAntiAlias(true); | 
| + | 
| + SkRRect rrect; | 
| + rrect.setRectRadii(rect, fRadii); | 
| + canvas->drawRRect(rrect, paint); | 
| + } | 
| + } | 
| + | 
| +private: | 
| 
 
robertphillips
2013/11/05 16:31:03
OCD me says these should be lined up.
 
scroggo
2013/11/05 20:45:41
Done.
 
 | 
| + SkString fName; | 
| + const int fWidth; | 
| + const int fHeight; | 
| + SkVector fRadii[4]; | 
| + typedef SkBenchmark INHERITED; | 
| +}; | 
| + | 
| +// Create one with dimensions/rounded corners based on the skp | 
| +DEF_BENCH(return new BlurRoundRectBench(600, 5514, 6, 6, 6, 6, 6, 6, 6, 6);) | 
| +// Same radii, much smaller rectangle | 
| +DEF_BENCH(return new BlurRoundRectBench(100, 100, 6, 6, 6, 6, 6, 6, 6, 6);) | 
| +// Rounded rect with two opposite corners with large radii, the other two | 
| +// small. | 
| +DEF_BENCH(return new BlurRoundRectBench(100, 100, 30, 30, 10, 10, 30, 30, 10, 10);) | 
| +DEF_BENCH(return new BlurRoundRectBench(100, 100, 90, 90, 90, 90, 90, 90, 90, 90);) |