Index: bench/nanobench.cpp |
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp |
index 07600ef3a447445737dc50626dc6d35e90bd97bd..a627b50a3a221ed0523c18176711bf7bfaca9cca 100644 |
--- a/bench/nanobench.cpp |
+++ b/bench/nanobench.cpp |
@@ -10,6 +10,7 @@ |
#include "nanobench.h" |
#include "Benchmark.h" |
+#include "CodecBench.h" |
#include "CrashHandler.h" |
#include "DecodingBench.h" |
#include "DecodingSubsetBench.h" |
@@ -23,6 +24,7 @@ |
#include "SkBBoxHierarchy.h" |
#include "SkCanvas.h" |
+#include "SkCodec.h" |
#include "SkCommonFlags.h" |
#include "SkData.h" |
#include "SkForceLinking.h" |
@@ -485,6 +487,7 @@ public: |
, fCurrentScale(0) |
, fCurrentSKP(0) |
, fCurrentUseMPD(0) |
+ , fCurrentCodec(0) |
, fCurrentImage(0) |
, fCurrentSubsetImage(0) |
, fCurrentColorType(0) |
@@ -632,16 +635,57 @@ public: |
fCurrentScale++; |
} |
+ for (; fCurrentCodec < fImages.count(); fCurrentCodec++) { |
+ const SkString& path = fImages[fCurrentCodec]; |
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str())); |
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
+ SkASSERT(codec); |
+ if (!codec) { |
+ // Nothing to time. |
+ continue; |
+ } |
+ while (fCurrentColorType < fColorTypes.count()) { |
+ SkColorType colorType = fColorTypes[fCurrentColorType]; |
+ fCurrentColorType++; |
+ // Make sure we can decode to this color type. |
+ SkBitmap bitmap; |
+ SkImageInfo info = codec->getInfo().makeColorType(colorType); |
+ bitmap.allocPixels(info); |
+ const SkImageGenerator::Result result = codec->getPixels( |
+ bitmap.info(), bitmap.getPixels(), bitmap.rowBytes()); |
+ switch (result) { |
+ case SkImageGenerator::kSuccess: |
+ case SkImageGenerator::kIncompleteInput: |
+ return new CodecBench(SkOSPath::Basename(path.c_str()), |
+ encoded, colorType); |
+ case SkImageGenerator::kInvalidConversion: |
+ // This is okay. Not all conversions are valid. |
+ break; |
+ case SkImageGenerator::kCouldNotRewind: |
+ // FIXME: This is due to a bug in some implementations |
+ // of SkCodec. All should support rewinding. |
+ break; |
+ default: |
+ // This represents some sort of failure. |
+ SkASSERT(false); |
+ break; |
+ } |
+ } |
+ fCurrentColorType = 0; |
+ } |
+ |
// 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 |
+ // Check if the image decodes to the right color type |
+ // before creating the benchmark |
SkBitmap bitmap; |
if (SkImageDecoder::DecodeFile(path.c_str(), &bitmap, |
- colorType, SkImageDecoder::kDecodePixels_Mode)) { |
+ colorType, SkImageDecoder::kDecodePixels_Mode) |
+ && bitmap.colorType() == colorType) { |
return new DecodingBench(path, colorType); |
} |
} |
@@ -741,6 +785,7 @@ private: |
int fCurrentScale; |
int fCurrentSKP; |
int fCurrentUseMPD; |
+ int fCurrentCodec; |
int fCurrentImage; |
int fCurrentSubsetImage; |
int fCurrentColorType; |