| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index eb48ec228d6b35886d6c8a87cd5e1c344f9479e3..d66b308b71e0b7364c6e2d04aef57af908ab280f 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -9,6 +9,8 @@
|
|
|
| #include "Benchmark.h"
|
| #include "CrashHandler.h"
|
| +#include "DecodingBench.h"
|
| +#include "DecodingSubsetBench.h"
|
| #include "GMBench.h"
|
| #include "ProcStats.h"
|
| #include "ResultsWriter.h"
|
| @@ -20,6 +22,7 @@
|
| #include "SkBBoxHierarchy.h"
|
| #include "SkCanvas.h"
|
| #include "SkCommonFlags.h"
|
| +#include "SkData.h"
|
| #include "SkForceLinking.h"
|
| #include "SkGraphics.h"
|
| #include "SkOSFile.h"
|
| @@ -439,7 +442,11 @@ public:
|
| , fCurrentRecording(0)
|
| , fCurrentScale(0)
|
| , fCurrentSKP(0)
|
| - , fCurrentUseMPD(0) {
|
| + , fCurrentUseMPD(0)
|
| + , fCurrentImage(0)
|
| + , fCurrentSubsetImage(0)
|
| + , fCurrentColorType(0)
|
| + , fDivisor(2) {
|
| for (int i = 0; i < FLAGS_skps.count(); i++) {
|
| if (SkStrEndsWith(FLAGS_skps[i], ".skp")) {
|
| fSKPs.push_back() = FLAGS_skps[i];
|
| @@ -469,6 +476,27 @@ public:
|
| if (FLAGS_mpd) {
|
| fUseMPDs.push_back() = true;
|
| }
|
| +
|
| + // Prepare the images for decoding
|
| + for (int i = 0; i < FLAGS_images.count(); i++) {
|
| + const char* flag = FLAGS_images[i];
|
| + if (sk_isdir(flag)) {
|
| + // If the value passed in is a directory, add all the images
|
| + SkOSFile::Iter it(flag);
|
| + SkString file;
|
| + while (it.next(&file)) {
|
| + fImages.push_back() = SkOSPath::Join(flag, file.c_str());
|
| + }
|
| + } else if (sk_exists(flag)) {
|
| + // Also add the value if it is a single image
|
| + fImages.push_back() = flag;
|
| + }
|
| + }
|
| +
|
| + // Choose the candidate color types for image decoding
|
| + const SkColorType colorTypes[] =
|
| + { kN32_SkColorType, kRGB_565_SkColorType, kAlpha_8_SkColorType };
|
| + fColorTypes.push_back_n(SK_ARRAY_COUNT(colorTypes), colorTypes);
|
| }
|
|
|
| static bool ReadPicture(const char* path, SkAutoTUnref<SkPicture>* pic) {
|
| @@ -562,6 +590,75 @@ public:
|
| fCurrentScale++;
|
| }
|
|
|
| + // Run the DecodingBenches
|
| + while (fCurrentImage < fImages.count()) {
|
| + while (fCurrentColorType < fColorTypes.count()) {
|
| + const SkString& path = fImages[fCurrentImage];
|
| + SkColorType colorType = fColorTypes[fCurrentColorType];
|
| + fCurrentColorType++;
|
| + // Check if the image decodes before creating the benchmark
|
| + SkBitmap bitmap;
|
| + if (SkImageDecoder::DecodeFile(path.c_str(), &bitmap,
|
| + colorType, SkImageDecoder::kDecodePixels_Mode)) {
|
| + return new DecodingBench(path, colorType);
|
| + }
|
| + }
|
| + fCurrentColorType = 0;
|
| + fCurrentImage++;
|
| + }
|
| +
|
| + // Run the DecodingSubsetBenches
|
| + while (fCurrentSubsetImage < fImages.count()) {
|
| + while (fCurrentColorType < fColorTypes.count()) {
|
| + const SkString& path = fImages[fCurrentSubsetImage];
|
| + SkColorType colorType = fColorTypes[fCurrentColorType];
|
| + fCurrentColorType++;
|
| + // Check if the image decodes before creating the benchmark
|
| + SkAutoTUnref<SkData> encoded(
|
| + SkData::NewFromFileName(path.c_str()));
|
| + SkAutoTDelete<SkMemoryStream> stream(
|
| + new SkMemoryStream(encoded));
|
| + SkAutoTDelete<SkImageDecoder>
|
| + decoder(SkImageDecoder::Factory(stream.get()));
|
| + if (!decoder) {
|
| + SkDebugf("Cannot find decoder for %s\n", path.c_str());
|
| + } else {
|
| + stream->rewind();
|
| + int w, h;
|
| + bool success;
|
| + if (!decoder->buildTileIndex(stream.detach(), &w, &h)
|
| + || w*h == 1) {
|
| + // This is not an error, but in this case we still
|
| + // do not want to run the benchmark.
|
| + success = false;
|
| + } else if (fDivisor > w || fDivisor > h) {
|
| + SkDebugf("Divisor %d is too big for %s %dx%d\n",
|
| + fDivisor, path.c_str(), w, h);
|
| + success = false;
|
| + } else {
|
| + const int sW = w / fDivisor;
|
| + const int sH = h / fDivisor;
|
| + SkBitmap bitmap;
|
| + success = true;
|
| + for (int y = 0; y < h; y += sH) {
|
| + for (int x = 0; x < w; x += sW) {
|
| + SkIRect rect = SkIRect::MakeXYWH(x, y, sW, sH);
|
| + success &= decoder->decodeSubset(&bitmap, rect,
|
| + colorType);
|
| + }
|
| + }
|
| + }
|
| + // Create the benchmark if successful
|
| + if (success) {
|
| + return new DecodingSubsetBench(path, colorType,
|
| + fDivisor);
|
| + }
|
| + }
|
| + }
|
| + fCurrentColorType = 0;
|
| + fCurrentSubsetImage++;
|
| + }
|
| +
|
| return NULL;
|
| }
|
|
|
| @@ -591,6 +688,8 @@ private:
|
| SkTArray<SkScalar> fScales;
|
| SkTArray<SkString> fSKPs;
|
| SkTArray<bool> fUseMPDs;
|
| + SkTArray<SkString> fImages;
|
| + SkTArray<SkColorType> fColorTypes;
|
|
|
| double fSKPBytes, fSKPOps;
|
|
|
| @@ -600,6 +699,10 @@ private:
|
| int fCurrentScale;
|
| int fCurrentSKP;
|
| int fCurrentUseMPD;
|
| + int fCurrentImage;
|
| + int fCurrentSubsetImage;
|
| + int fCurrentColorType;
|
| + const int fDivisor;
|
| };
|
|
|
| int nanobench_main();
|
|
|