diff options
| author | 2024-09-11 14:18:44 +0000 | |
|---|---|---|
| committer | 2024-09-23 17:05:02 +0000 | |
| commit | cf3d3fc31be8a1d497e4f029d541c4a15c14eb34 (patch) | |
| tree | 0729c1c6898f00d2595fdc978fc9a529e99904ca | |
| parent | bdbe57d573dc74fcf77cdc1abc4e680dcf3f78d2 (diff) | |
SkAndroidCodec: Use getGainmapAndroidCodec
Bug: 349357636
Flag: EXEMPT refactor
Test: courage
Test: Viewing UltraHDR images in Photos
Change-Id: Ifc467d930fe1dc96989751d0a9be30284d292175
| -rw-r--r-- | libs/hwui/hwui/ImageDecoder.cpp | 11 | ||||
| -rw-r--r-- | libs/hwui/jni/BitmapFactory.cpp | 14 | ||||
| -rw-r--r-- | libs/hwui/jni/BitmapRegionDecoder.cpp | 27 |
3 files changed, 14 insertions, 38 deletions
diff --git a/libs/hwui/hwui/ImageDecoder.cpp b/libs/hwui/hwui/ImageDecoder.cpp index 588463c49497..e074a27db38f 100644 --- a/libs/hwui/hwui/ImageDecoder.cpp +++ b/libs/hwui/hwui/ImageDecoder.cpp @@ -501,18 +501,13 @@ SkCodec::Result ImageDecoder::decode(void* pixels, size_t rowBytes) { 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 785aef312072..49a7f73fb3a3 100644 --- a/libs/hwui/jni/BitmapFactory.cpp +++ b/libs/hwui/jni/BitmapFactory.cpp @@ -183,14 +183,8 @@ static bool needsFineScale(const SkISize fullSize, const SkISize decodedSize, 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 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr<SkStreamRewindable> stream, 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 6a65b8273194..f7e8e073a272 100644 --- a/libs/hwui/jni/BitmapRegionDecoder.cpp +++ b/libs/hwui/jni/BitmapRegionDecoder.cpp @@ -48,25 +48,14 @@ public: } 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 @@ public: 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 |