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);) |