| Index: dm/DMSrcSink.cpp
|
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
|
| index de9ee76c8076611960e4a9849fa402326776155b..9e9a77c27124e85350406c7e84ec3b2f8f5f0886 100644
|
| --- a/dm/DMSrcSink.cpp
|
| +++ b/dm/DMSrcSink.cpp
|
| @@ -52,7 +52,11 @@ Name GMSrc::name() const {
|
|
|
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
| -CodecSrc::CodecSrc(Path path, Mode mode) : fPath(path), fMode(mode) {}
|
| +CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType)
|
| + : fPath(path)
|
| + , fMode(mode)
|
| + , fDstColorType(dstColorType)
|
| +{}
|
|
|
| Error CodecSrc::draw(SkCanvas* canvas) const {
|
| SkImageInfo canvasInfo;
|
| @@ -66,27 +70,53 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| 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());
|
| + if (NULL == codec.get()) {
|
| + return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
|
| + }
|
| +
|
| + // Choose the color type to decode to
|
| + SkImageInfo decodeInfo = codec->getInfo();
|
| + SkColorType canvasColorType = canvasInfo.colorType();
|
| + switch (fDstColorType) {
|
| + case kIndex8_Always_DstColorType:
|
| + case kGrayscale_Always_DstColorType:
|
| + if (kRGB_565_SkColorType == canvasColorType) {
|
| + return Error::Nonfatal("Testing non-565 to 565 is uninteresting.");
|
| + }
|
| + break;
|
| + default:
|
| + decodeInfo = decodeInfo.makeColorType(canvasColorType);
|
| + break;
|
| + }
|
| +
|
| + // Construct a color table for the decode if necessary
|
| + SkAutoTUnref<SkColorTable> colorTable(NULL);
|
| + SkPMColor* colorPtr = NULL;
|
| + int* colorCountPtr = NULL;
|
| + int maxColors = 256;
|
| + if (kIndex_8_SkColorType == decodeInfo.colorType()) {
|
| + SkPMColor colors[256];
|
| + colorTable.reset(SkNEW_ARGS(SkColorTable, (colors, maxColors)));
|
| + colorPtr = const_cast<SkPMColor*>(colorTable->readColors());
|
| + colorCountPtr = &maxColors;
|
| }
|
|
|
| - SkImageInfo decodeInfo = codec->getInfo().makeColorType(canvasInfo.colorType());
|
| + // FIXME: Currently we cannot draw unpremultiplied sources.
|
| if (decodeInfo.alphaType() == kUnpremul_SkAlphaType) {
|
| - // FIXME: Currently we cannot draw unpremultiplied sources.
|
| decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType);
|
| }
|
|
|
| SkBitmap bitmap;
|
| - if (!bitmap.tryAllocPixels(decodeInfo)) {
|
| + if (!bitmap.tryAllocPixels(decodeInfo, NULL, colorTable.get())) {
|
| return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(),
|
| decodeInfo.width(), decodeInfo.height());
|
| }
|
|
|
| switch (fMode) {
|
| case kNormal_Mode:
|
| - switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes())) {
|
| + switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes(), NULL,
|
| + colorPtr, colorCountPtr)) {
|
| case SkImageGenerator::kSuccess:
|
| // We consider incomplete to be valid, since we should still decode what is
|
| // available.
|
|
|