From 326b429ba49608962feaf3e1057f7a7607fc3e4c Mon Sep 17 00:00:00 2001 From: Radzivon Bartoshyk Date: Sat, 16 Nov 2024 12:33:37 +0000 Subject: [PATCH] Change hardware buffers flags --- .../java/com/awxkee/jxlcoder/MainActivity.kt | 105 +++++++++++------- .../src/main/cpp/HardwareBuffersCompat.cpp | 18 ++- jxlcoder/src/main/cpp/HardwareBuffersCompat.h | 2 +- jxlcoder/src/main/cpp/ReformatBitmap.cpp | 5 +- .../jxlcoder/animation/AnimatedDrawable.kt | 4 +- 5 files changed, 76 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt index 3274a74..28b3cb2 100644 --- a/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt +++ b/app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt @@ -125,6 +125,9 @@ class MainActivity : ComponentActivity() { var imagesArray = remember { mutableStateListOf() } + var drawablesArray = remember { + mutableStateListOf() + } LaunchedEffect(key1 = Unit, block = { lifecycleScope.launch(Dispatchers.IO) { val buffer5 = @@ -183,59 +186,66 @@ class MainActivity : ComponentActivity() { // lifecycleScope.launch { // drawables.add(BitmapDrawable(resources, bitmap)) // } - val space = bitmap.copy(Bitmap.Config.ARGB_8888, true) - val encoded = - JxlCoder.encode( - space, - channelsConfiguration = JxlChannelsConfiguration.RGB, - effort = JxlEffort.LIGHTNING, - compressionOption = JxlCompressionOption.LOSSLESS, - quality = 100, - ) - val decoded = JxlCoder.decodeSampled( - encoded, - preferredColorConfig = PreferredColorConfig.RGBA_8888, width = 1305, - height = 1295 - ) - lifecycleScope.launch { - imagesArray.add(decoded) - } +// val space = bitmap.copy(Bitmap.Config.ARGB_8888, true) +// val encoded = +// JxlCoder.encode( +// space, +// channelsConfiguration = JxlChannelsConfiguration.RGB, +// effort = JxlEffort.LIGHTNING, +// compressionOption = JxlCompressionOption.LOSSLESS, +// quality = 100, +// ) +// val decoded = JxlCoder.decodeSampled( +// encoded, +// preferredColorConfig = PreferredColorConfig.HARDWARE, width = 1305, +// height = 1295 +// ) +// lifecycleScope.launch { +// imagesArray.add(decoded) +// } -// var assets = -// (this@MainActivity.assets.list("") ?: return@launch).toList() -//// assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") } -// for (asset in assets) { -// try { -// val buffer4 = -// this@MainActivity.assets.open(asset).source().buffer() -// .readByteArray() -// -// val largeImageSize = JxlCoder.getSize(buffer4) -// if (largeImageSize != null) { -// val time = measureTimeMillis { + var assets = + (this@MainActivity.assets.list("") ?: return@launch).toList() + assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") } + for (asset in assets) { + try { + val buffer4 = + this@MainActivity.assets.open(asset).source().buffer() + .readByteArray() + + val largeImageSize = JxlCoder.getSize(buffer4) + if (largeImageSize != null) { + val time = measureTimeMillis { // val srcImage = JxlCoder.decodeSampled( // buffer4, // largeImageSize.width / 2, // largeImageSize.height / 2, -// preferredColorConfig = PreferredColorConfig.RGBA_8888, +// preferredColorConfig = PreferredColorConfig.HARDWARE, // com.awxkee.jxlcoder.ScaleMode.FIT, // toneMapper = JxlToneMapper.REC2408, // ) -//// val srcImage = JxlCoder.decode(buffer4, -//// preferredColorConfig = PreferredColorConfig.RGB_565, -//// toneMapper = JxlToneMapper.REC2408) + val animatedImage = JxlAnimatedImage( + buffer4, + preferredColorConfig = PreferredColorConfig.HARDWARE, + scaleMode = ScaleMode.FIT, + toneMapper = JxlToneMapper.REC2408, + ) + drawablesArray.add(animatedImage.animatedDrawable) +// val srcImage = JxlCoder.decode(buffer4, +// preferredColorConfig = PreferredColorConfig.RGB_565, +// toneMapper = JxlToneMapper.REC2408) // lifecycleScope.launch { // imagesArray.add(srcImage) // } -// } -// Log.d("JXLCoder", "Decoding done in ${time}ms") -// } -// } catch (e: Exception) { -// if (e !is FileNotFoundException) { -// throw e -// } -// } -// } + } + Log.d("JXLCoder", "Decoding done in ${time}ms") + } + } catch (e: Exception) { + if (e !is FileNotFoundException) { + throw e + } + } + } } }) // A surface container using the 'background' color from the theme @@ -276,6 +286,17 @@ class MainActivity : ComponentActivity() { contentDescription = "ok" ) } + +// items(drawablesArray.count(), key = { +// return@items UUID.randomUUID().toString() +// }) { +// Image( +// rememberDrawablePainter(drawable = drawablesArray[it]), +// modifier = Modifier.fillMaxWidth(), +// contentScale = ContentScale.FillWidth, +// contentDescription = "ok" +// ) +// } } } } diff --git a/jxlcoder/src/main/cpp/HardwareBuffersCompat.cpp b/jxlcoder/src/main/cpp/HardwareBuffersCompat.cpp index 0dabf55..fa69d07 100644 --- a/jxlcoder/src/main/cpp/HardwareBuffersCompat.cpp +++ b/jxlcoder/src/main/cpp/HardwareBuffersCompat.cpp @@ -61,48 +61,44 @@ bool loadAHardwareBuffersAPI() { && AHardwareBuffer_describe_compat != nullptr; } alreadyHdBuffersLoaded = true; - void *hhl = dlopen("libandroid.so", RTLD_NOW); - if (!hhl) { - return false; - } - AHardwareBuffer_allocate_compat = (AHardwareBufferAllocateFunc) dlsym(hhl, + AHardwareBuffer_allocate_compat = (AHardwareBufferAllocateFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_allocate"); if (AHardwareBuffer_allocate_compat == nullptr) { return false; } - AHardwareBuffer_isSupported_compat = (AHardwareBufferIsSupportedFunc) dlsym(hhl, + AHardwareBuffer_isSupported_compat = (AHardwareBufferIsSupportedFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_isSupported"); if (AHardwareBuffer_isSupported_compat == nullptr) { return false; } - AHardwareBuffer_unlock_compat = (AHardwareBufferUnlockFunc) dlsym(hhl, + AHardwareBuffer_unlock_compat = (AHardwareBufferUnlockFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_unlock"); if (AHardwareBuffer_unlock_compat == nullptr) { return false; } - AHardwareBuffer_release_compat = (AHardwareBufferReleaseFunc) dlsym(hhl, + AHardwareBuffer_release_compat = (AHardwareBufferReleaseFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_release"); if (AHardwareBuffer_release_compat == nullptr) { return false; } - AHardwareBuffer_lock_compat = (AHardwareBufferLockFunc) dlsym(hhl, + AHardwareBuffer_lock_compat = (AHardwareBufferLockFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_lock"); if (AHardwareBuffer_lock_compat == nullptr) { return false; } - AHardwareBuffer_toHardwareBuffer_compat = (AHardwareBufferToHardwareBufferFunc) dlsym(hhl, + AHardwareBuffer_toHardwareBuffer_compat = (AHardwareBufferToHardwareBufferFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_toHardwareBuffer"); if (AHardwareBuffer_toHardwareBuffer_compat == nullptr) { return false; } - AHardwareBuffer_describe_compat = (AHardwareBufferDescribeFunc) dlsym(hhl, + AHardwareBuffer_describe_compat = (AHardwareBufferDescribeFunc) dlsym(RTLD_DEFAULT, "AHardwareBuffer_describe"); if (AHardwareBuffer_describe_compat == nullptr) { return false; diff --git a/jxlcoder/src/main/cpp/HardwareBuffersCompat.h b/jxlcoder/src/main/cpp/HardwareBuffersCompat.h index 7bbcdf3..1a46d9d 100644 --- a/jxlcoder/src/main/cpp/HardwareBuffersCompat.h +++ b/jxlcoder/src/main/cpp/HardwareBuffersCompat.h @@ -43,7 +43,7 @@ typedef int (*_Nullable AHardwareBufferIsSupportedFunc)( const AHardwareBuffer_Desc *_Nonnull desc ); -typedef int (*_Nullable AHardwareBufferReleaseFunc)( +typedef void (*_Nullable AHardwareBufferReleaseFunc)( AHardwareBuffer *_Nonnull buffer ); diff --git a/jxlcoder/src/main/cpp/ReformatBitmap.cpp b/jxlcoder/src/main/cpp/ReformatBitmap.cpp index 96a664f..9804225 100644 --- a/jxlcoder/src/main/cpp/ReformatBitmap.cpp +++ b/jxlcoder/src/main/cpp/ReformatBitmap.cpp @@ -203,7 +203,8 @@ ReformatColorConfig(JNIEnv *env, std::vector &imageData, std::string &i bufferDesc.format = (*useFloats) ? AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT : AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; - bufferDesc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; + bufferDesc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN | + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT; AHardwareBuffer *hardwareBuffer = nullptr; @@ -216,7 +217,7 @@ ReformatColorConfig(JNIEnv *env, std::vector &imageData, std::string &i uint8_t *buffer = nullptr; status = AHardwareBuffer_lock_compat(hardwareBuffer, - AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, + AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, &rect, reinterpret_cast(&buffer)); if (status != 0) { AHardwareBuffer_release_compat(hardwareBuffer); diff --git a/jxlcoder/src/main/java/com/awxkee/jxlcoder/animation/AnimatedDrawable.kt b/jxlcoder/src/main/java/com/awxkee/jxlcoder/animation/AnimatedDrawable.kt index 433e1ab..c740693 100644 --- a/jxlcoder/src/main/java/com/awxkee/jxlcoder/animation/AnimatedDrawable.kt +++ b/jxlcoder/src/main/java/com/awxkee/jxlcoder/animation/AnimatedDrawable.kt @@ -228,11 +228,11 @@ public class AnimatedDrawable( } override fun getIntrinsicHeight(): Int { - return bounds.height() + return frameStore.height } override fun getIntrinsicWidth(): Int { - return bounds.width() + return frameStore.width } override fun setColorFilter(colorFilter: ColorFilter?) {