SkAndroidCodec: Use getGainmapAndroidCodec
Bug: 349357636
Flag: EXEMPT refactor
Test: courage
Test: Viewing UltraHDR images in Photos
Change-Id: Ifc467d930fe1dc96989751d0a9be30284d292175
diff --git a/libs/hwui/hwui/ImageDecoder.cpp b/libs/hwui/hwui/ImageDecoder.cpp
index 588463c..e074a27 100644
--- a/libs/hwui/hwui/ImageDecoder.cpp
+++ b/libs/hwui/hwui/ImageDecoder.cpp
@@ -501,18 +501,13 @@
SkCodec::Result ImageDecoder::extractGainmap(Bitmap* destination, bool isShared) {
ATRACE_CALL();
SkGainmapInfo gainmapInfo;
- std::unique_ptr<SkStream> gainmapStream;
+ std::unique_ptr<SkAndroidCodec> gainmapCodec;
{
- ATRACE_NAME("getAndroidGainmap");
- if (!mCodec->getAndroidGainmap(&gainmapInfo, &gainmapStream)) {
+ ATRACE_NAME("getGainmapAndroidCodec");
+ if (!mCodec->getGainmapAndroidCodec(&gainmapInfo, &gainmapCodec)) {
return SkCodec::kSuccess;
}
}
- auto gainmapCodec = SkAndroidCodec::MakeFromStream(std::move(gainmapStream));
- if (!gainmapCodec) {
- ALOGW("Failed to create codec for gainmap stream");
- return SkCodec::kInvalidInput;
- }
ImageDecoder decoder{std::move(gainmapCodec)};
// Gainmap inherits the origin of the containing image
decoder.mOverrideOrigin.emplace(getOrigin());
diff --git a/libs/hwui/jni/BitmapFactory.cpp b/libs/hwui/jni/BitmapFactory.cpp
index 785aef3..49a7f73 100644
--- a/libs/hwui/jni/BitmapFactory.cpp
+++ b/libs/hwui/jni/BitmapFactory.cpp
@@ -183,14 +183,8 @@
needsFineScale(fullSize.height(), decodedSize.height(), sampleSize);
}
-static bool decodeGainmap(std::unique_ptr<SkStream> gainmapStream, const SkGainmapInfo& gainmapInfo,
+static bool decodeGainmap(std::unique_ptr<SkAndroidCodec> codec, const SkGainmapInfo& gainmapInfo,
sp<uirenderer::Gainmap>* outGainmap, const int sampleSize, float scale) {
- std::unique_ptr<SkAndroidCodec> codec;
- codec = SkAndroidCodec::MakeFromStream(std::move(gainmapStream), nullptr);
- if (!codec) {
- ALOGE("Can not create a codec for Gainmap.");
- return false;
- }
SkColorType decodeColorType = kN32_SkColorType;
if (codec->getInfo().colorType() == kGray_8_SkColorType) {
decodeColorType = kGray_8_SkColorType;
@@ -613,15 +607,15 @@
bool hasGainmap = false;
SkGainmapInfo gainmapInfo;
- std::unique_ptr<SkStream> gainmapStream = nullptr;
+ std::unique_ptr<SkAndroidCodec> gainmapCodec;
sp<uirenderer::Gainmap> gainmap = nullptr;
if (result == SkCodec::kSuccess) {
- hasGainmap = codec->getAndroidGainmap(&gainmapInfo, &gainmapStream);
+ hasGainmap = codec->getGainmapAndroidCodec(&gainmapInfo, &gainmapCodec);
}
if (hasGainmap) {
hasGainmap =
- decodeGainmap(std::move(gainmapStream), gainmapInfo, &gainmap, sampleSize, scale);
+ decodeGainmap(std::move(gainmapCodec), gainmapInfo, &gainmap, sampleSize, scale);
}
if (!isMutable && javaBitmap == NULL) {
diff --git a/libs/hwui/jni/BitmapRegionDecoder.cpp b/libs/hwui/jni/BitmapRegionDecoder.cpp
index 6a65b82..f7e8e07 100644
--- a/libs/hwui/jni/BitmapRegionDecoder.cpp
+++ b/libs/hwui/jni/BitmapRegionDecoder.cpp
@@ -48,25 +48,14 @@
}
SkGainmapInfo gainmapInfo;
- std::unique_ptr<SkStream> gainmapStream;
+ std::unique_ptr<SkAndroidCodec> gainmapCodec;
std::unique_ptr<skia::BitmapRegionDecoder> gainmapBRD = nullptr;
- if (mainImageBRD->getAndroidGainmap(&gainmapInfo, &gainmapStream)) {
- sk_sp<SkData> data = nullptr;
- if (gainmapStream->getMemoryBase()) {
- // It is safe to make without copy because we'll hold onto the stream.
- data = SkData::MakeWithoutCopy(gainmapStream->getMemoryBase(),
- gainmapStream->getLength());
- } else {
- data = SkCopyStreamToData(gainmapStream.get());
- // We don't need to hold the stream anymore
- gainmapStream = nullptr;
- }
- gainmapBRD = skia::BitmapRegionDecoder::Make(std::move(data));
+ if (!mainImageBRD->getGainmapBitmapRegionDecoder(&gainmapInfo, &gainmapBRD)) {
+ gainmapBRD = nullptr;
}
- return std::unique_ptr<BitmapRegionDecoderWrapper>(
- new BitmapRegionDecoderWrapper(std::move(mainImageBRD), std::move(gainmapBRD),
- gainmapInfo, std::move(gainmapStream)));
+ return std::unique_ptr<BitmapRegionDecoderWrapper>(new BitmapRegionDecoderWrapper(
+ std::move(mainImageBRD), std::move(gainmapBRD), gainmapInfo));
}
SkEncodedImageFormat getEncodedFormat() { return mMainImageBRD->getEncodedFormat(); }
@@ -191,16 +180,14 @@
private:
BitmapRegionDecoderWrapper(std::unique_ptr<skia::BitmapRegionDecoder> mainImageBRD,
std::unique_ptr<skia::BitmapRegionDecoder> gainmapBRD,
- SkGainmapInfo info, std::unique_ptr<SkStream> stream)
+ SkGainmapInfo info)
: mMainImageBRD(std::move(mainImageBRD))
, mGainmapBRD(std::move(gainmapBRD))
- , mGainmapInfo(info)
- , mGainmapStream(std::move(stream)) {}
+ , mGainmapInfo(info) {}
std::unique_ptr<skia::BitmapRegionDecoder> mMainImageBRD;
std::unique_ptr<skia::BitmapRegionDecoder> mGainmapBRD;
SkGainmapInfo mGainmapInfo;
- std::unique_ptr<SkStream> mGainmapStream;
};
} // namespace android