aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/BlendmodeBench.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-07-04 09:05:32 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-04 16:47:29 +0000
commitbfa23d7d87819ede95941b70862b35448a7da1b9 (patch)
treebeb47c0f2f47b0c1d38ebf885b9c828e4716e555 /bench/BlendmodeBench.cpp
parent6b59bf424c9d9d8a72d3c002871f143e6aff623e (diff)
update blendmode bench
Bug: skia: Change-Id: Id47fedd9e346035af0f14b9a9c171c79eec0d9cd Reviewed-on: https://skia-review.googlesource.com/21407 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'bench/BlendmodeBench.cpp')
-rw-r--r--bench/BlendmodeBench.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/bench/BlendmodeBench.cpp b/bench/BlendmodeBench.cpp
new file mode 100644
index 0000000000..d38807a208
--- /dev/null
+++ b/bench/BlendmodeBench.cpp
@@ -0,0 +1,106 @@
+/*
+ * 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 "Benchmark.h"
+#include "SkBlendModePriv.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+#include "SkString.h"
+
+// Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
+class XfermodeBench : public Benchmark {
+public:
+ XfermodeBench(SkBlendMode mode, bool aa) : fBlendMode(mode) {
+ fAA = aa;
+ fName.printf("blendmode_%s_%s", aa ? "mask" : "rect", SkBlendMode_Name(mode));
+ }
+
+protected:
+ const char* onGetName() override { return fName.c_str(); }
+
+ void onDraw(int loops, SkCanvas* canvas) override {
+ const char* text = "Hamburgefons";
+ size_t len = strlen(text);
+ SkISize size = canvas->getBaseLayerSize();
+ SkRandom random;
+ for (int i = 0; i < loops; ++i) {
+ SkPaint paint;
+ paint.setBlendMode(fBlendMode);
+ paint.setColor(random.nextU());
+ if (fAA) {
+ // Draw text to exercise AA code paths.
+ paint.setAntiAlias(true);
+ paint.setTextSize(random.nextRangeScalar(12, 96));
+ SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth),
+ y = random.nextRangeScalar(0, (SkScalar)size.fHeight);
+ for (int j = 0; j < 1000; ++j) {
+ canvas->drawText(text, len, x, y, paint);
+ }
+ } else {
+ // Draw rects to exercise non-AA code paths.
+ SkScalar w = random.nextRangeScalar(50, 100);
+ SkScalar h = random.nextRangeScalar(50, 100);
+ SkRect rect = SkRect::MakeXYWH(
+ random.nextUScalar1() * (size.fWidth - w),
+ random.nextUScalar1() * (size.fHeight - h),
+ w,
+ h
+ );
+ for (int j = 0; j < 1000; ++j) {
+ canvas->drawRect(rect, paint);
+ }
+ }
+ }
+ }
+
+private:
+ SkBlendMode fBlendMode;
+ SkString fName;
+ bool fAA;
+
+ typedef Benchmark INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+#define BENCH(...) \
+ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \
+ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); )
+
+BENCH(SkBlendMode::kClear)
+BENCH(SkBlendMode::kSrc)
+BENCH(SkBlendMode::kDst)
+BENCH(SkBlendMode::kSrcOver)
+BENCH(SkBlendMode::kDstOver)
+BENCH(SkBlendMode::kSrcIn)
+BENCH(SkBlendMode::kDstIn)
+BENCH(SkBlendMode::kSrcOut)
+BENCH(SkBlendMode::kDstOut)
+BENCH(SkBlendMode::kSrcATop)
+BENCH(SkBlendMode::kDstATop)
+BENCH(SkBlendMode::kXor)
+
+BENCH(SkBlendMode::kPlus)
+BENCH(SkBlendMode::kModulate)
+BENCH(SkBlendMode::kScreen)
+
+BENCH(SkBlendMode::kOverlay)
+BENCH(SkBlendMode::kDarken)
+BENCH(SkBlendMode::kLighten)
+BENCH(SkBlendMode::kColorDodge)
+BENCH(SkBlendMode::kColorBurn)
+BENCH(SkBlendMode::kHardLight)
+BENCH(SkBlendMode::kSoftLight)
+BENCH(SkBlendMode::kDifference)
+BENCH(SkBlendMode::kExclusion)
+BENCH(SkBlendMode::kMultiply)
+
+BENCH(SkBlendMode::kHue)
+BENCH(SkBlendMode::kSaturation)
+BENCH(SkBlendMode::kColor)
+BENCH(SkBlendMode::kLuminosity)