aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm/DMSrcSink.cpp
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2015-09-01 14:57:57 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-01 14:57:57 -0700
commit9e707a04127f35b199bb943b6f50ff4cf60506f8 (patch)
treeec7de7bd5535bde72d3bc1a5aa4ba2ca9d6cf760 /dm/DMSrcSink.cpp
parent9aa32d1d830c030000c1178b1297035a9b53d5bc (diff)
Various improvements to CodecSrc testing in dm
*** Add CodecMode and ScaledCodecMode (in place of NormalMode), so now we test SkCodec's getPixels() and SkScaledCodec's getPixels() *** Don't attempt to test scanline and codec modes using the dimensions that were recommended for SkScaledCodec. *** Change tags so that each scale gets its own output folder. TODO: Make ScanlineMode and ScanlineSubsetMode support kOutOfOrder etc. I think this belongs with the gif CL - I don't want to add test modes that we don't run yet. BUG=skia:4202 BUG=skia:4238 Review URL: https://codereview.chromium.org/1327433003
Diffstat (limited to 'dm/DMSrcSink.cpp')
-rw-r--r--dm/DMSrcSink.cpp53
1 files changed, 29 insertions, 24 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 64c18fc95f..2c80fac6be 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -85,14 +85,6 @@ SkScanlineDecoder* start_scanline_decoder(SkData* encoded, const SkImageInfo& in
if (nullptr == scanlineDecoder) {
return nullptr;
}
- // DM scanline test assume kTopDown scanline ordering. Other orderings are
- // tested from within SkScaledCodec.
- // TODO (msarett): Redesign the CodecSrc tests to improve our coverage of SkCodec and
- // SkScanlineDecoder functionality. Maybe we should write code to explicitly
- // test kNone, kOutOfOrder, and kBottomUp.
- if (SkScanlineDecoder::kTopDown_SkScanlineOrder != scanlineDecoder->getScanlineOrder()) {
- return nullptr;
- }
if (SkCodec::kSuccess != scanlineDecoder->start(info, NULL, colorPtr, colorCountPtr)) {
return nullptr;
}
@@ -104,13 +96,20 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
if (!encoded) {
return SkStringPrintf("Couldn't read %s.", fPath.c_str());
}
- SkAutoTDelete<SkCodec> codec(SkScaledCodec::NewFromData(encoded));
- if (nullptr == codec.get()) {
- // scaledCodec not supported, try normal codec
- codec.reset(SkCodec::NewFromData(encoded));
+ SkAutoTDelete<SkCodec> codec(NULL);
+ if (kScaledCodec_Mode == fMode) {
+ codec.reset(SkScaledCodec::NewFromData(encoded));
+ // TODO (msarett): This should fall through to a fatal error once we support scaled
+ // codecs for all image types.
if (nullptr == codec.get()) {
- return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
+ return Error::Nonfatal(SkStringPrintf("Couldn't create scaled codec for %s.",
+ fPath.c_str()));
}
+ } else {
+ codec.reset(SkCodec::NewFromData(encoded));
+ }
+ if (nullptr == codec.get()) {
+ return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
}
// Choose the color type to decode to
@@ -171,7 +170,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
}
switch (fMode) {
- case kNormal_Mode: {
+ case kScaledCodec_Mode:
+ case kCodec_Mode: {
switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes(), nullptr,
colorPtr, colorCountPtr)) {
case SkCodec::kSuccess:
@@ -192,7 +192,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
SkAutoTDelete<SkScanlineDecoder> scanlineDecoder(
start_scanline_decoder(encoded.get(), decodeInfo, colorPtr, colorCountPtr));
if (nullptr == scanlineDecoder) {
- return Error::Nonfatal("Could not start top-down scanline decoder");
+ return Error::Nonfatal("Could not start scanline decoder");
}
const SkCodec::Result result = scanlineDecoder->getScanlines(
@@ -234,7 +234,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
SkImageInfo largestSubsetDecodeInfo =
decodeInfo.makeWH(subsetWidth + extraX, subsetHeight + extraY);
SkBitmap largestSubsetBm;
- if (!largestSubsetBm.tryAllocPixels(largestSubsetDecodeInfo, nullptr, colorTable.get())) {
+ if (!largestSubsetBm.tryAllocPixels(largestSubsetDecodeInfo, nullptr,
+ colorTable.get())) {
return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(),
largestSubsetDecodeInfo.width(), largestSubsetDecodeInfo.height());
}
@@ -252,10 +253,11 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
subsetHeight + extraY : subsetHeight;
const int y = row * subsetHeight;
//create scanline decoder for each subset
- SkAutoTDelete<SkScanlineDecoder> subsetScanlineDecoder(
- start_scanline_decoder(encoded.get(), decodeInfo,
- colorPtr, colorCountPtr));
- if (nullptr == subsetScanlineDecoder) {
+ SkAutoTDelete<SkScanlineDecoder> decoder(start_scanline_decoder(encoded.get(),
+ decodeInfo, colorPtr, colorCountPtr));
+ // TODO (msarett): Support this mode for all scanline orderings.
+ if (nullptr == decoder || SkScanlineDecoder::kTopDown_SkScanlineOrder !=
+ decoder->getScanlineOrder()) {
if (x == 0 && y == 0) {
//first try, image may not be compatible
return Error::Nonfatal("Could not start top-down scanline decoder");
@@ -264,8 +266,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
}
}
//skip to first line of subset
- const SkCodec::Result skipResult =
- subsetScanlineDecoder->skipScanlines(y);
+ const SkCodec::Result skipResult = decoder->skipScanlines(y);
switch (skipResult) {
case SkCodec::kSuccess:
case SkCodec::kIncompleteInput:
@@ -281,7 +282,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
SkAssertResult(largestSubsetBm.extractSubset(&subsetBm, bounds));
SkAutoLockPixels autlockSubsetBm(subsetBm, true);
const SkCodec::Result subsetResult =
- subsetScanlineDecoder->getScanlines(buffer, currentSubsetHeight, rowBytes);
+ decoder->getScanlines(buffer, currentSubsetHeight, rowBytes);
switch (subsetResult) {
case SkCodec::kSuccess:
case SkCodec::kIncompleteInput:
@@ -323,7 +324,11 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
// Decode odd stripes
SkAutoTDelete<SkScanlineDecoder> decoder(
start_scanline_decoder(encoded.get(), decodeInfo, colorPtr, colorCountPtr));
- if (nullptr == decoder) {
+ if (nullptr == decoder ||
+ SkScanlineDecoder::kTopDown_SkScanlineOrder != decoder->getScanlineOrder()) {
+ // This mode was designed to test the new skip scanlines API in libjpeg-turbo.
+ // Jpegs have kTopDown_SkScanlineOrder, and at this time, it is not interesting
+ // to run this test for image types that do not have this scanline ordering.
return Error::Nonfatal("Could not start top-down scanline decoder");
}
for (int i = 0; i < numStripes; i += 2) {