Chromium Code Reviews| Index: bench/RectoriBench.cpp |
| =================================================================== |
| --- bench/RectoriBench.cpp (revision 0) |
| +++ bench/RectoriBench.cpp (revision 0) |
| @@ -0,0 +1,107 @@ |
| +/* |
| + * 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 "SkCanvas.h" |
| +#include "SkPaint.h" |
| +#include "SkRandom.h" |
| +#include "SkBlurMaskFilter.h" |
| +#include "SkLayerDrawLooper.h" |
| + |
| +// This bench replicates a problematic use case of a draw looper used |
| +// to create an inner blurred rect |
| +class RectoriBench : public SkBenchmark { |
| +public: |
| + enum { |
|
bsalomon
2013/05/10 20:18:22
private?
robertphillips
2013/05/13 14:10:47
Done.
|
| + W = 640, |
| + H = 480, |
| + }; |
| + |
| + enum { N = SkBENCHLOOP(100) }; |
|
bsalomon
2013/05/10 20:18:22
private?
robertphillips
2013/05/13 14:10:47
Done.
|
| + |
| + RectoriBench(void* param) : INHERITED(param) {} |
| + |
| +protected: |
| + |
| + virtual const char* onGetName() { |
| + return "rectori"; |
| + } |
| + |
| + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
| + SkMWCRandom gRandom; |
|
bsalomon
2013/05/10 20:18:22
this isn't global, maybe drop the g prefix?
robertphillips
2013/05/13 14:10:47
Done.
|
| + |
| + for (int i = 0; i < N; i++) { |
| + SkScalar blurRad = gRandom.nextRangeScalar(1.5f, 25.0f); |
| + SkScalar size = gRandom.nextRangeScalar(20*blurRad, 50*blurRad); |
| + |
| + SkScalar x = gRandom.nextRangeScalar(0.0f, W - size); |
| + SkScalar y = gRandom.nextRangeScalar(0.0f, H - size); |
| + |
| + SkRect inner = { x, y, x + size, y + size }; |
| + |
| + SkRect outer(inner); |
| + // outer is always outset either 2x or 4x the blur radius (we go with 2x) |
| + outer.outset(SkIntToScalar(2*blurRad), SkIntToScalar(2*blurRad)); |
| + |
| + SkPath p; |
| + |
| + p.addRect(outer); |
| + p.addRect(inner); |
| + p.setFillType(SkPath::kEvenOdd_FillType); |
| + |
| + // This will be used to translate the normal draw outside the |
| + // clip rect and translate the blurred version back inside |
| + SkScalar translate = 2.0f * size; |
| + |
| + SkPaint paint; |
| + paint.setLooper(this->createLooper(-translate, blurRad))->unref(); |
| + paint.setColor(0xff000000 | gRandom.nextU()); |
| + paint.setAntiAlias(true); |
| + |
| + canvas->save(); |
| + // clip always equals inner rect so we get the inside blur |
| + canvas->clipRect(inner); |
| + canvas->translate(translate, 0); |
| + canvas->drawPath(p, paint); |
| + canvas->restore(); |
| + } |
| + } |
| +private: |
|
bsalomon
2013/05/10 20:18:22
\n
robertphillips
2013/05/13 14:10:47
Done - I think.
|
| + SkLayerDrawLooper* createLooper(SkScalar xOff, SkScalar radius) { |
| + SkLayerDrawLooper* looper = new SkLayerDrawLooper; |
| + |
| + //----------------------------------------------- |
| + SkLayerDrawLooper::LayerInfo info; |
| + |
| + info.fFlagsMask = 0; |
| + // TODO: add a color filter to better match what is seen in the wild |
| + info.fPaintBits = /* SkLayerDrawLooper::kColorFilter_Bit |*/ |
| + SkLayerDrawLooper::kMaskFilter_Bit; |
| + info.fColorMode = SkXfermode::kDst_Mode; |
| + info.fOffset.set(xOff, 0); |
| + info.fPostTranslate = false; |
| + |
| + SkPaint* paint = looper->addLayer(info); |
| + |
| + SkMaskFilter* mf = SkBlurMaskFilter::Create(SkIntToScalar(radius), |
| + SkBlurMaskFilter::kNormal_BlurStyle, |
| + SkBlurMaskFilter::kHighQuality_BlurFlag); |
| + paint->setMaskFilter(mf)->unref(); |
| + |
| + //----------------------------------------------- |
| + info.fPaintBits = 0; |
| + info.fOffset.set(0, 0); |
| + |
| + paint = looper->addLayer(info); |
| + return looper; |
| + } |
| + |
| + typedef SkBenchmark INHERITED; |
| +}; |
| + |
| + |
| +DEF_BENCH( return SkNEW_ARGS(RectoriBench, (p)); ) |
| Property changes on: bench\RectoriBench.cpp |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |