diff options
author | Mike Reed <reed@google.com> | 2017-07-04 09:05:32 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-04 16:47:29 +0000 |
commit | bfa23d7d87819ede95941b70862b35448a7da1b9 (patch) | |
tree | beb47c0f2f47b0c1d38ebf885b9c828e4716e555 /bench/BlendmodeBench.cpp | |
parent | 6b59bf424c9d9d8a72d3c002871f143e6aff623e (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.cpp | 106 |
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) |