From 8e679fe0238771c32609a4f33045dd599509d2cf Mon Sep 17 00:00:00 2001 From: "robertphillips@google.com" Date: Thu, 17 Jan 2013 19:51:41 +0000 Subject: Added new bench to test out 1xN BitmapProcShaders https://codereview.appspot.com/7160043/ git-svn-id: http://skia.googlecode.com/svn/trunk@7264 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/TileBench.cpp | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 bench/TileBench.cpp (limited to 'bench/TileBench.cpp') 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)) -- cgit v1.2.3