aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/TileBench.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-17 19:51:41 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-17 19:51:41 +0000
commit8e679fe0238771c32609a4f33045dd599509d2cf (patch)
tree88cbc5aebf32d785669309edfbfe1b1cd159d655 /bench/TileBench.cpp
parentb30bfb7a7c53846b47871690db48e7c7590bfd6e (diff)
Added new bench to test out 1xN BitmapProcShaders
Diffstat (limited to 'bench/TileBench.cpp')
-rw-r--r--bench/TileBench.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/bench/TileBench.cpp b/bench/TileBench.cpp
new file mode 100644
index 0000000000..661be9abea
--- /dev/null
+++ b/bench/TileBench.cpp
@@ -0,0 +1,130 @@
+
+/*
+ * 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 "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkShader.h"
+#include "SkString.h"
+
+static void create_gradient(SkBitmap* bm) {
+ SkASSERT(1 == bm->width());
+ const int height = bm->height();
+
+ float deltaB = 255.0f / height;
+ float blue = 255.0f;
+
+ SkAutoLockPixels lock(*bm);
+ for (int y = 0; y < height; y++) {
+ *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue);
+ blue -= deltaB;
+ }
+}
+
+// Test out the special case of a tiled 1xN texture. Test out opacity,
+// filtering and the different tiling modes
+class ConstXTileBench : public SkBenchmark {
+ SkPaint fPaint;
+ SkString fName;
+ bool fDoFilter;
+ bool fDoTrans;
+ enum { N = SkBENCHLOOP(20) };
+ static const int kWidth = 1;
+ static const int kHeight = 300;
+
+public:
+ ConstXTileBench(void* param,
+ SkShader::TileMode xTile,
+ SkShader::TileMode yTile,
+ bool doFilter,
+ bool doTrans)
+ : INHERITED(param)
+ , fDoFilter(doFilter)
+ , fDoTrans(doTrans) {
+ SkBitmap bm;
+
+ bm.setConfig(SkBitmap::kARGB_8888_Config, kWidth, kHeight);
+
+ bm.allocPixels();
+ bm.eraseColor(SK_ColorWHITE);
+ bm.setIsOpaque(true);
+
+ create_gradient(&bm);
+
+ SkShader* s = SkShader::CreateBitmapShader(bm, xTile, yTile);
+ fPaint.setShader(s)->unref();
+
+ fName.printf("constXTile_");
+
+ static const char* gTileModeStr[SkShader::kTileModeCount] = { "C", "R", "M" };
+ fName.append(gTileModeStr[xTile]);
+ fName.append(gTileModeStr[yTile]);
+
+ if (doFilter) {
+ fName.append("_filter");
+ }
+
+ if (doTrans) {
+ fName.append("_trans");
+ }
+ }
+
+protected:
+ virtual const char* onGetName() {
+ return fName.c_str();
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ SkPaint paint(fPaint);
+ this->setupPaint(&paint);
+ paint.setFilterBitmap(fDoFilter);
+ if (fDoTrans) {
+ paint.setColor(SkColorSetARGBMacro(0x80, 0xFF, 0xFF, 0xFF));
+ }
+
+ SkRect r;
+
+ if (fDoFilter) {
+ r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480));
+ canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
+ } else {
+ r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480));
+ }
+
+ SkPaint bgPaint;
+ bgPaint.setColor(SK_ColorWHITE);
+
+ for (int i = 0; i < N; i++) {
+ if (fDoTrans) {
+ canvas->drawRect(r, bgPaint);
+ }
+
+ canvas->drawRect(r, paint);
+ }
+ }
+
+private:
+ typedef SkBenchmark INHERITED;
+};
+
+
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, false))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, false))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, false))
+
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, false))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, false))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, false))
+
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, true))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, true))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, true))
+
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, true))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, true))
+DEF_BENCH(return new ConstXTileBench(p, SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, true))