Support Gainmap for shared memory allocation.

Bug: 267217209
Test: android.graphics.cts.ImageDecoderTest
Change-Id: Ie07b5f3b6b2b563d8790a121be7b925e8a097bcb
This commit is contained in:
Sally Qi
2023-03-07 15:13:16 -08:00
parent 5a0ac4f8e3
commit caa2ef5982
3 changed files with 10 additions and 6 deletions

View File

@@ -498,7 +498,7 @@ SkCodec::Result ImageDecoder::decode(void* pixels, size_t rowBytes) {
return result;
}
SkCodec::Result ImageDecoder::extractGainmap(Bitmap* destination) {
SkCodec::Result ImageDecoder::extractGainmap(Bitmap* destination, bool isShared) {
ATRACE_CALL();
SkGainmapInfo gainmapInfo;
std::unique_ptr<SkStream> gainmapStream;
@@ -553,9 +553,12 @@ SkCodec::Result ImageDecoder::extractGainmap(Bitmap* destination) {
return SkCodec::kInternalError;
}
// TODO: We don't currently parcel the gainmap, but if we should then also support
// the shared allocator
sk_sp<Bitmap> nativeBitmap = Bitmap::allocateHeapBitmap(&bm);
sk_sp<Bitmap> nativeBitmap;
if (isShared) {
nativeBitmap = Bitmap::allocateAshmemBitmap(&bm);
} else {
nativeBitmap = Bitmap::allocateHeapBitmap(&bm);
}
if (!nativeBitmap) {
ALOGE("OOM allocating Bitmap with dimensions %i x %i", bitmapInfo.width(),
bitmapInfo.height());

View File

@@ -79,7 +79,7 @@ public:
// Set whether the ImageDecoder should handle RestorePrevious frames.
void setHandleRestorePrevious(bool handle);
SkCodec::Result extractGainmap(Bitmap* destination);
SkCodec::Result extractGainmap(Bitmap* destination, bool isShared);
private:
// State machine for keeping track of how to handle RestorePrevious (RP)

View File

@@ -354,7 +354,8 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
// cost of RAM
if (result == SkCodec::kSuccess && !jpostProcess && !preferRamOverQuality) {
// The gainmap costs RAM to improve quality, so skip this if we're prioritizing RAM instead
result = decoder->extractGainmap(nativeBitmap.get());
result = decoder->extractGainmap(nativeBitmap.get(),
allocator == kSharedMemory_Allocator ? true : false);
jexception = get_and_clear_exception(env);
}