| Index: src/codec/SkCodec_libico.cpp | 
| diff --git a/src/codec/SkCodec_libico.cpp b/src/codec/SkCodec_libico.cpp | 
| index ea00f65df0462962c179f51aa95d55b89e81601f..2f1543e47ee1a6ee97edd514ca3edd26041d7473 100644 | 
| --- a/src/codec/SkCodec_libico.cpp | 
| +++ b/src/codec/SkCodec_libico.cpp | 
| @@ -176,6 +176,17 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { | 
| } | 
| SkImageInfo info = codecs->operator[](maxIndex)->getInfo(); | 
|  | 
| +    // ICOs contain an alpha mask after the image which means we cannot | 
| +    // guarantee that an image is opaque, even if the sub-codec thinks it | 
| +    // is. | 
| +    // FIXME (msarett): The BMP decoder depends on the alpha type in order | 
| +    // to decode correctly, otherwise it could report kUnpremul and we would | 
| +    // not have to correct it here. Is there a better way? | 
| +    // FIXME (msarett): This is only true for BMP in ICO - could a PNG in ICO | 
| +    // be opaque? Is it okay that we missed out on the opportunity to mark | 
| +    // such an image as opaque? | 
| +    info = info.makeAlphaType(kUnpremul_SkAlphaType); | 
| + | 
| // Note that stream is owned by the embedded codec, the ico does not need | 
| // direct access to the stream. | 
| return SkNEW_ARGS(SkIcoCodec, (info, codecs.detach())); | 
| @@ -233,17 +244,24 @@ SkCodec::Result SkIcoCodec::onGetPixels(const SkImageInfo& dstInfo, | 
| // Subsets are not supported. | 
| return kUnimplemented; | 
| } | 
| + | 
| +    if (!valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) { | 
| +        return kInvalidConversion; | 
| +    } | 
| + | 
| // We return invalid scale if there is no candidate image with matching | 
| // dimensions. | 
| Result result = kInvalidScale; | 
| for (int32_t i = 0; i < fEmbeddedCodecs->count(); i++) { | 
| +        SkCodec* embeddedCodec = fEmbeddedCodecs->operator[](i); | 
| // If the dimensions match, try to decode | 
| -        if (dstInfo.dimensions() == | 
| -                fEmbeddedCodecs->operator[](i)->getInfo().dimensions()) { | 
| +        if (dstInfo.dimensions() == embeddedCodec->getInfo().dimensions()) { | 
|  | 
| // Perform the decode | 
| -            result = fEmbeddedCodecs->operator[](i)->getPixels(dstInfo, | 
| -                    dst, dstRowBytes, &opts, ct, ptr); | 
| +            // FIXME: (msarett): ICO is considered non-opaque, even if the embedded BMP | 
| +            // incorrectly claims it has no alpha. | 
| +            SkImageInfo info = dstInfo.makeAlphaType(embeddedCodec->getInfo().alphaType()); | 
| +            result = embeddedCodec->getPixels(info, dst, dstRowBytes, &opts, ct, ptr); | 
|  | 
| // On a fatal error, keep trying to find an image to decode | 
| if (kInvalidConversion == result || kInvalidInput == result || | 
|  |