Index: bench/RectoriBench.cpp |
=================================================================== |
--- bench/RectoriBench.cpp (revision 0) |
+++ bench/RectoriBench.cpp (revision 0) |
@@ -0,0 +1,108 @@ |
+/* |
+ * 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: |
+ RectoriBench(void* param) : INHERITED(param) {} |
+ |
+protected: |
+ |
+ virtual const char* onGetName() { |
+ return "rectori"; |
+ } |
+ |
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ SkMWCRandom Random; |
+ |
+ for (int i = 0; i < N; i++) { |
+ SkScalar blurRad = Random.nextRangeScalar(1.5f, 25.0f); |
+ SkScalar size = Random.nextRangeScalar(20*blurRad, 50*blurRad); |
+ |
+ SkScalar x = Random.nextRangeScalar(0.0f, W - size); |
+ SkScalar y = Random.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 | Random.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: |
+ enum { |
+ W = 640, |
+ H = 480, |
+ }; |
+ |
+ enum { N = SkBENCHLOOP(100) }; |
+ |
+ 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 |