diff options
author | 2015-02-13 09:05:41 -0800 | |
---|---|---|
committer | 2015-02-13 09:05:42 -0800 | |
commit | 95f192d19938b98a45dd1fa4112d965f60d10516 (patch) | |
tree | a0c6f343f0d97f7022c117139d1d1ac9597ab4ec /bench/DecodingSubsetBench.cpp | |
parent | a8fcea0cd09080de45143f2726059398cd8b8049 (diff) |
Adding new benchmark to test image decoding performance.
BUG=skia:
Review URL: https://codereview.chromium.org/918673002
Diffstat (limited to 'bench/DecodingSubsetBench.cpp')
-rw-r--r-- | bench/DecodingSubsetBench.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/bench/DecodingSubsetBench.cpp b/bench/DecodingSubsetBench.cpp new file mode 100644 index 0000000000..dc3c9f39cc --- /dev/null +++ b/bench/DecodingSubsetBench.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "DecodingSubsetBench.h" +#include "SkData.h" +#include "SkImageDecoder.h" +#include "SkOSFile.h" +#include "SkStream.h" + +/* + * + * This benchmark is designed to test the performance of image subset decoding. + * It is invoked from the nanobench.cpp file. + * + */ +DecodingSubsetBench::DecodingSubsetBench(SkString path, SkColorType colorType, + const int divisor) + : fColorType(colorType) + , fDivisor(divisor) +{ + // Parse filename and the color type to give the benchmark a useful name + SkString baseName = SkOSPath::Basename(path.c_str()); + const char* colorName; + switch(colorType) { + case kN32_SkColorType: + colorName = "N32"; + break; + case kRGB_565_SkColorType: + colorName = "565"; + break; + case kAlpha_8_SkColorType: + colorName = "Alpha8"; + break; + default: + colorName = "Unknown"; + } + fName.printf("DecodeSubset_%dx%d_%s_%s", fDivisor, fDivisor, + baseName.c_str(), colorName); + + // Perform the decode setup + SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str())); + fStream.reset(new SkMemoryStream(encoded)); + fDecoder.reset(SkImageDecoder::Factory(fStream)); +} + +const char* DecodingSubsetBench::onGetName() { + return fName.c_str(); +} + +bool DecodingSubsetBench::isSuitableFor(Backend backend) { + return kNonRendering_Backend == backend; +} + +void DecodingSubsetBench::onDraw(const int n, SkCanvas* canvas) { + for (int i = 0; i < n; i++) { + int w, h; + fDecoder->buildTileIndex(fStream->duplicate(), &w, &h); + // Divide the image into subsets and decode each subset + const int sW = w / fDivisor; + const int sH = h / fDivisor; + for (int y = 0; y < h; y += sH) { + for (int x = 0; x < w; x += sW) { + SkBitmap bitmap; + SkIRect rect = SkIRect::MakeXYWH(x, y, sW, sH); + fDecoder->decodeSubset(&bitmap, rect, fColorType); + } + } + } +} |