diff options
-rw-r--r-- | dm/DMSrcSink.cpp | 4 | ||||
-rw-r--r-- | src/codec/SkAndroidCodec.cpp | 32 |
2 files changed, 29 insertions, 7 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 1ffffd3bf0..4ac7e80626 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -173,9 +173,6 @@ Error BRDSrc::draw(SkCanvas* canvas) const { return "Cannot decode (full) region."; } alpha8_to_gray8(&bitmap); - - // Verify that we no longer support kIndex8 from this API. - SkASSERT(kIndex_8_SkColorType != bitmap.colorType()); canvas->drawBitmap(bitmap, 0, 0); return ""; } @@ -232,7 +229,6 @@ Error BRDSrc::draw(SkCanvas* canvas) const { } alpha8_to_gray8(&bitmap); - SkASSERT(kIndex_8_SkColorType != bitmap.colorType()); canvas->drawBitmapRect(bitmap, SkRect::MakeXYWH((SkScalar) scaledBorder, (SkScalar) scaledBorder, (SkScalar) (subsetWidth / fSampleSize), diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp index 6c9152b08a..b30dd52e4c 100644 --- a/src/codec/SkAndroidCodec.cpp +++ b/src/codec/SkAndroidCodec.cpp @@ -105,19 +105,39 @@ SkAndroidCodec* SkAndroidCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader } SkColorType SkAndroidCodec::computeOutputColorType(SkColorType requestedColorType) { + // The legacy GIF and WBMP decoders always decode to kIndex_8_SkColorType. + // We will maintain this behavior when we can. + const SkColorType suggestedColorType = this->getInfo().colorType(); + switch ((SkEncodedImageFormat) this->getEncodedFormat()) { + case SkEncodedImageFormat::kGIF: + if (suggestedColorType == kIndex_8_SkColorType) { + return kIndex_8_SkColorType; + } + break; + case SkEncodedImageFormat::kWBMP: + return kIndex_8_SkColorType; + default: + break; + } + bool highPrecision = fCodec->getEncodedInfo().bitsPerComponent() > 8; switch (requestedColorType) { case kARGB_4444_SkColorType: return kN32_SkColorType; case kN32_SkColorType: + // F16 is the Android default for high precision images. + return highPrecision ? kRGBA_F16_SkColorType : kN32_SkColorType; case kIndex_8_SkColorType: + if (kIndex_8_SkColorType == suggestedColorType) { + return kIndex_8_SkColorType; + } break; case kAlpha_8_SkColorType: // Fall through to kGray_8. Before kGray_8_SkColorType existed, // we allowed clients to request kAlpha_8 when they wanted a // grayscale decode. case kGray_8_SkColorType: - if (kGray_8_SkColorType == this->getInfo().colorType()) { + if (kGray_8_SkColorType == suggestedColorType) { return kGray_8_SkColorType; } break; @@ -132,8 +152,14 @@ SkColorType SkAndroidCodec::computeOutputColorType(SkColorType requestedColorTyp break; } - // F16 is the Android default for high precision images. - return highPrecision ? kRGBA_F16_SkColorType : kN32_SkColorType; + // Android has limited support for kGray_8 (using kAlpha_8). We will not + // use kGray_8 for Android unless they specifically ask for it. + if (kGray_8_SkColorType == suggestedColorType) { + return kN32_SkColorType; + } + + // |suggestedColorType| may be kN32_SkColorType or kIndex_8_SkColorType. + return highPrecision ? kRGBA_F16_SkColorType : suggestedColorType; } SkAlphaType SkAndroidCodec::computeOutputAlphaType(bool requestedUnpremul) { |