Chromium Code Reviews| Index: dm/DMSrcSink.cpp |
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
| index 5ca66c50e207c4809f41396e907d354d4d78a17d..69feb1da13d95f08d4a21fe84f6ebc6bad5e7c27 100644 |
| --- a/dm/DMSrcSink.cpp |
| +++ b/dm/DMSrcSink.cpp |
| @@ -38,59 +38,98 @@ Name GMSrc::name() const { |
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
| +CodecSrc::CodecSrc(Path path) : fPath(path) {} |
| + |
| +Error CodecSrc::draw(SkCanvas* canvas) const { |
| + SkImageInfo canvasInfo; |
| + if (NULL == canvas->peekPixels(&canvasInfo, NULL)) { |
| + return Error::Nonfatal("No need to test decoding to non-raster backend."); |
|
mtklein
2015/03/17 20:24:15
// TODO: rethink with JPGs ?
scroggo
2015/03/19 12:57:55
Done.
|
| + } |
| + |
| + SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
| + if (!encoded) { |
| + return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
| + } |
| + |
| + SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
| + if (!codec) { |
| + return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
| + } |
| + |
| + SkImageInfo decodeInfo; |
| + if (!codec->getInfo(&decodeInfo)) { |
| + return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str()); |
| + } |
| + |
| + decodeInfo = decodeInfo.makeColorType(canvasInfo.colorType()); |
| + if (decodeInfo.alphaType() == kUnpremul_SkAlphaType) { |
| + // FIXME: Currently we cannot draw unpremultiplied sources. |
| + decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType); |
| + } |
| + |
| + SkBitmap bitmap; |
| + if (!bitmap.tryAllocPixels(decodeInfo)) { |
| + return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(), |
| + decodeInfo.width(), decodeInfo.height()); |
| + } |
| + |
| + SkAutoLockPixels alp(bitmap); |
|
mtklein
2015/03/17 20:24:15
This seems fine, but it's not needed right? SkBit
scroggo
2015/03/19 12:57:54
The implementation of tryAllocPixels does lock aut
|
| + const SkImageGenerator::Result result = codec->getPixels(decodeInfo, bitmap.getPixels(), |
| + bitmap.rowBytes()); |
| + switch (result) { |
|
mtklein
2015/03/17 20:24:15
Might consider fusing into
switch (codec->getPixe
scroggo
2015/03/19 12:57:54
Done.
|
| + case SkImageGenerator::kSuccess: |
| + // We consider incomplete to be valid, since we should still decode what is |
| + // available. |
| + case SkImageGenerator::kIncompleteInput: |
| + canvas->drawBitmap(bitmap, 0, 0); |
| + return ""; |
| + case SkImageGenerator::kInvalidConversion: |
| + return Error::Nonfatal("Incompatible colortype conversion"); |
| + default: |
| + // Everything else is considered a failure. |
| + return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); |
| + } |
| +} |
| + |
| +SkISize CodecSrc::size() const { |
| + SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
| + SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
| + SkImageInfo info; |
| + if (codec && codec->getInfo(&info)) { |
| + return info.dimensions(); |
| + } |
| + return SkISize::Make(0,0); |
| +} |
| + |
| +Name CodecSrc::name() const { |
| + return SkOSPath::Basename(fPath.c_str()); |
| +} |
| + |
| +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
| + |
| ImageSrc::ImageSrc(Path path, int divisor) : fPath(path), fDivisor(divisor) {} |
| Error ImageSrc::draw(SkCanvas* canvas) const { |
| + SkImageInfo canvasInfo; |
| + if (NULL == canvas->peekPixels(&canvasInfo, NULL)) { |
| + return Error::Nonfatal("No need to test decoding to non-raster backend."); |
|
scroggo
2015/03/19 12:57:54
I've also added a TODO to ImageSrc to use deferred
|
| + } |
| + |
| SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
| if (!encoded) { |
| return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
| } |
| - const SkColorType dstColorType = canvas->imageInfo().colorType(); |
| + const SkColorType dstColorType = canvasInfo.colorType(); |
| if (fDivisor == 0) { |
| // Decode the full image. |
| SkBitmap bitmap; |
| - if (FLAGS_codec) { |
| - SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
| - if (!codec) { |
| - return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
| - } |
| - SkImageInfo info; |
| - if (!codec->getInfo(&info)) { |
| - return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str()); |
| - } |
| - info = info.makeColorType(dstColorType); |
| - if (info.alphaType() == kUnpremul_SkAlphaType) { |
| - // FIXME: Currently we cannot draw unpremultiplied sources. |
| - info = info.makeAlphaType(kPremul_SkAlphaType); |
| - } |
| - if (!bitmap.tryAllocPixels(info)) { |
| - return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(), |
| - info.width(), info.height()); |
| - } |
| - SkAutoLockPixels alp(bitmap); |
| - const SkImageGenerator::Result result = codec->getPixels(info, bitmap.getPixels(), |
| - bitmap.rowBytes()); |
| - switch (result) { |
| - case SkImageGenerator::kSuccess: |
| - // We consider incomplete to be valid, since we should still decode what is |
| - // available. |
| - case SkImageGenerator::kIncompleteInput: |
| - break; |
| - case SkImageGenerator::kInvalidConversion: |
| - return Error::Nonfatal("Incompatible colortype conversion"); |
| - default: |
| - // Everything else is considered a failure. |
| - return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); |
| - } |
| - } else { |
| - if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap, |
| - dstColorType, SkImageDecoder::kDecodePixels_Mode)) { |
| - return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
| - } |
| - if (kRGB_565_SkColorType == dstColorType && !bitmap.isOpaque()) { |
| - // Do not draw a bitmap with alpha to a destination without alpha. |
| - return Error::Nonfatal("Uninteresting to decode image with alpha into 565."); |
| - } |
| + if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap, |
| + dstColorType, SkImageDecoder::kDecodePixels_Mode)) { |
| + return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
| + } |
| + if (kRGB_565_SkColorType == dstColorType && !bitmap.isOpaque()) { |
| + // Do not draw a bitmap with alpha to a destination without alpha. |
| + return Error::Nonfatal("Uninteresting to decode image with alpha into 565."); |
| } |
| encoded.reset((SkData*)NULL); // Might as well drop this when we're done with it. |
| canvas->drawBitmap(bitmap, 0,0); |