}
SkASSERT(nullptr != decoderMgr);
fDecoderMgr.reset(decoderMgr);
+
+ fSwizzler.reset(nullptr);
+ fSrcRow = nullptr;
+ fStorage.reset();
+
return true;
}
return kInvalidConversion;
}
- // Remove objects used for sampling.
- fSwizzler.reset(nullptr);
- fSrcRow = nullptr;
- fStorage.reset();
-
// Now, given valid output dimensions, we can start the decompress
if (!jpeg_start_decompress(fDecoderMgr->dinfo())) {
SkCodecPrintf("start decompress failed\n");
REPORTER_ASSERT(r, !codec);
}
+
+DEF_TEST(Codec_jpeg_rewind, r) {
+ const char* path = "mandrill_512_q075.jpg";
+ SkAutoTDelete<SkStream> stream(resource(path));
+ if (!stream) {
+ SkDebugf("Missing resource '%s'\n", path);
+ return;
+ }
+ SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromStream(stream.release()));
+ if (!codec) {
+ ERRORF(r, "Unable to create codec '%s'.", path);
+ return;
+ }
+
+ const int width = codec->getInfo().width();
+ const int height = codec->getInfo().height();
+ size_t rowBytes = sizeof(SkPMColor) * width;
+ SkAutoMalloc pixelStorage(height * rowBytes);
+
+ // Perform a sampled decode.
+ SkAndroidCodec::AndroidOptions opts;
+ opts.fSampleSize = 12;
+ codec->getAndroidPixels(codec->getInfo().makeWH(width / 12, height / 12), pixelStorage.get(),
+ rowBytes, &opts);
+
+ // Rewind the codec and perform a full image decode.
+ SkCodec::Result result = codec->getPixels(codec->getInfo(), pixelStorage.get(), rowBytes);
+ REPORTER_ASSERT(r, SkCodec::kSuccess == result);
+}