aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DMSrcSink.cpp4
-rw-r--r--src/codec/SkAndroidCodec.cpp32
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) {