From 5fc226641a0926dddbf70ba784f344881f4c05b9 Mon Sep 17 00:00:00 2001 From: humper Date: Mon, 25 Aug 2014 11:17:48 -0700 Subject: [PATCH] Benchmark designed to exercise fractional image scale/translation BUG=skia: R=reed@google.com Author: humper@google.com Review URL: https://codereview.chromium.org/491793003 --- bench/BitmapFractionalBench.cpp | 104 ++++++++++++++++++++++++++++++++ gyp/bench.gypi | 1 + 2 files changed, 105 insertions(+) create mode 100644 bench/BitmapFractionalBench.cpp diff --git a/bench/BitmapFractionalBench.cpp b/bench/BitmapFractionalBench.cpp new file mode 100644 index 0000000000..601e830823 --- /dev/null +++ b/bench/BitmapFractionalBench.cpp @@ -0,0 +1,104 @@ +/* + * 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 "SkBlurMask.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkRandom.h" +#include "SkShader.h" +#include "SkString.h" + +class BitmapFractionalBench: public Benchmark { + int fInputSize; + int fOutputSize; + SkPaint::FilterLevel fFilterLevel; + SkString fName; + +public: + BitmapFractionalBench( int is, const char *name, SkPaint::FilterLevel filterLevel ) { + fInputSize = is; + fOutputSize = 2*is; + fFilterLevel = filterLevel; + fName.printf( "bitmap_fractional_bench_%s", name ); + } + +protected: + + SkBitmap fInputBitmap, fOutputBitmap; + SkMatrix fMatrix; + + virtual const char* onGetName() { + return fName.c_str(); + } + + int inputSize() const { + return fInputSize; + } + + int outputSize() const { + return fOutputSize; + } + + SkIPoint onGetSize() SK_OVERRIDE { + return SkIPoint::Make( fOutputSize, fOutputSize ); + } + + virtual void onPreDraw() { + fInputBitmap.allocN32Pixels(fInputSize, fInputSize, true); + fInputBitmap.eraseColor(SK_ColorWHITE); + + fOutputBitmap.allocN32Pixels(fOutputSize, fOutputSize, true); + } + + virtual void onDraw(const int loops, SkCanvas*) { + SkPaint paint; + this->setupPaint(&paint); + + preBenchSetup(); + + SkCanvas canvas( fOutputBitmap ); + paint.setFilterLevel(fFilterLevel); + fInputBitmap.notifyPixelsChanged(); + + for (int i = 0; i < loops; i++) { + // up-scale the image by a variety of close, fractional scales + for (int j = 0 ; j < 20 ; j++) { + fMatrix = SkMatrix::I(); + fMatrix.setScale( 1 + j/500.f, 1 + j/500.f ); + canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); + } + // down-scale the image by a variety of close, fractional scales + for (int j = 0 ; j < 20 ; j++) { + fMatrix = SkMatrix::I(); + fMatrix.setScale( 1 - j/500.f, 1 - j/500.f ); + canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); + } + // Now try some fractional translates + for (int j = 0 ; j < 20 ; j++) { + fMatrix = SkMatrix::I(); + fMatrix.setTranslate( j/3.f, j/3.f ); + canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); + } + // Finally, some fractional translates with non-identity scale. + for (int j = 0 ; j < 20 ; j++) { + fMatrix = SkMatrix::I(); + fMatrix.setTranslate( j/3.f, j/3.f ); + fMatrix.preScale( 1.5f, 1.5f ); + canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); + } + } + } + + virtual void preBenchSetup() {} +private: + typedef Benchmark INHERITED; +}; + +DEF_BENCH(return new BitmapFractionalBench(256, "high", SkPaint::kHigh_FilterLevel);) +DEF_BENCH(return new BitmapFractionalBench(256, "medium", SkPaint::kMedium_FilterLevel);) +DEF_BENCH(return new BitmapFractionalBench(256, "low", SkPaint::kLow_FilterLevel);) diff --git a/gyp/bench.gypi b/gyp/bench.gypi index 92e0574f2b..bc9c0d9b4f 100644 --- a/gyp/bench.gypi +++ b/gyp/bench.gypi @@ -25,6 +25,7 @@ '../bench/AAClipBench.cpp', '../bench/AlternatingColorPatternBench.cpp', '../bench/BitmapBench.cpp', + '../bench/BitmapFractionalBench.cpp', '../bench/BitmapRectBench.cpp', '../bench/BitmapScaleBench.cpp', '../bench/BlurBench.cpp', -- 2.34.1