From 818328c482092655cea6296b9dc99279e473ea93 Mon Sep 17 00:00:00 2001 From: John Reck Date: Tue, 9 May 2023 17:50:33 -0400 Subject: [PATCH] Support decoding gainmaps to alpha8 with BitmapFactory. Bug: 271174821 Test: android.graphics.cts.GainmapTest Change-Id: Ifdb285ea3f6bb6a3de44b216d1b4bb2c1826469a --- libs/hwui/jni/BitmapFactory.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libs/hwui/jni/BitmapFactory.cpp b/libs/hwui/jni/BitmapFactory.cpp index 38d17de166e98..8abcd9a59122d 100644 --- a/libs/hwui/jni/BitmapFactory.cpp +++ b/libs/hwui/jni/BitmapFactory.cpp @@ -194,7 +194,11 @@ static bool decodeGainmap(std::unique_ptr gainmapStream, const SkGainm ALOGE("Can not create a codec for Gainmap."); return false; } - SkColorType decodeColorType = codec->computeOutputColorType(kN32_SkColorType); + SkColorType decodeColorType = kN32_SkColorType; + if (codec->getInfo().colorType() == kGray_8_SkColorType) { + decodeColorType = kGray_8_SkColorType; + } + decodeColorType = codec->computeOutputColorType(decodeColorType); sk_sp decodeColorSpace = codec->computeOutputColorSpace(decodeColorType, nullptr); SkISize size = codec->getSampledDimensions(sampleSize); @@ -217,7 +221,11 @@ static bool decodeGainmap(std::unique_ptr gainmapStream, const SkGainm const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(), decodeColorType, alphaType, decodeColorSpace); - const SkImageInfo& bitmapInfo = decodeInfo; + SkImageInfo bitmapInfo = decodeInfo; + if (decodeColorType == kGray_8_SkColorType) { + // We treat gray8 as alpha8 in Bitmap's API surface + bitmapInfo = bitmapInfo.makeColorType(kAlpha_8_SkColorType); + } SkBitmap decodeBitmap; sk_sp nativeBitmap = nullptr;