diff options
author | humper <humper@google.com> | 2014-08-25 11:17:48 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-25 11:17:48 -0700 |
commit | 5fc226641a0926dddbf70ba784f344881f4c05b9 (patch) | |
tree | d47b12b2aacb3c4bfb8c394497b94bfa9f76a897 /bench | |
parent | b2a16919d9c2f7e633eca0a46be3d590dccbca17 (diff) |
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
Diffstat (limited to 'bench')
-rw-r--r-- | bench/BitmapFractionalBench.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
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);) |