summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2023-05-09 17:50:33 -0400
committer Sally Qi <sallyqi@google.com> 2023-05-11 15:54:04 -0700
commit818328c482092655cea6296b9dc99279e473ea93 (patch)
treef3289cb6b2701385a6c285c1e80bd1b2d93d65d1
parentbce1bf4fdc1ad147f31b40fb4c9df7cd06a84629 (diff)
Support decoding gainmaps to alpha8 with BitmapFactory.
Bug: 271174821 Test: android.graphics.cts.GainmapTest Change-Id: Ifdb285ea3f6bb6a3de44b216d1b4bb2c1826469a
-rw-r--r--libs/hwui/jni/BitmapFactory.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/libs/hwui/jni/BitmapFactory.cpp b/libs/hwui/jni/BitmapFactory.cpp
index 38d17de166e9..8abcd9a59122 100644
--- a/libs/hwui/jni/BitmapFactory.cpp
+++ b/libs/hwui/jni/BitmapFactory.cpp
@@ -194,7 +194,11 @@ static bool decodeGainmap(std::unique_ptr<SkStream> 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<SkColorSpace> decodeColorSpace = codec->computeOutputColorSpace(decodeColorType, nullptr);
SkISize size = codec->getSampledDimensions(sampleSize);
@@ -217,7 +221,11 @@ static bool decodeGainmap(std::unique_ptr<SkStream> 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<Bitmap> nativeBitmap = nullptr;