From 1088e5259aa19d9169f821fa36911f12beb5f3be Mon Sep 17 00:00:00 2001 From: Christopher O'Grady Date: Fri, 10 Jan 2025 14:24:12 -0500 Subject: [PATCH] Make background on characters and icons transparent. --- .../vbhelper/components/CharacterEntry.kt | 6 ++-- .../vbhelper/components/DexDimEntry.kt | 5 ++-- .../nacabaro/vbhelper/utils/BitmapData.kt | 29 ++++++++++++++++++- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt index 9aba969..85ae2e0 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt @@ -13,7 +13,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.unit.dp +import com.github.nacabaro.vbhelper.domain.Sprites import com.github.nacabaro.vbhelper.utils.BitmapData +import com.github.nacabaro.vbhelper.utils.getBitmap import java.nio.ByteBuffer @Composable @@ -23,9 +25,7 @@ fun CharacterEntry( onClick: () -> Unit = { } ) { val bitmap = remember (icon.bitmap) { - Bitmap.createBitmap(icon.width, icon.height, Bitmap.Config.RGB_565).apply { - copyPixelsFromBuffer(ByteBuffer.wrap(icon.bitmap)) - } + icon.getBitmap() } val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt index 3e67873..5958e8b 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.unit.dp import com.github.nacabaro.vbhelper.utils.BitmapData +import com.github.nacabaro.vbhelper.utils.getBitmap import java.nio.ByteBuffer @Composable @@ -27,9 +28,7 @@ fun DexDiMEntry( modifier: Modifier = Modifier ) { val bitmap = remember (logo.bitmap) { - Bitmap.createBitmap(logo.width, logo.height, Bitmap.Config.RGB_565).apply { - copyPixelsFromBuffer(ByteBuffer.wrap(logo.bitmap)) - } + logo.getBitmap() } val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt index 2ec891c..6c68df7 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt @@ -1,8 +1,35 @@ package com.github.nacabaro.vbhelper.utils +import android.graphics.Bitmap +import com.github.cfogrady.vb.dim.sprite.SpriteData + // simple, but smooth data class BitmapData ( val bitmap: ByteArray, val width: Int, val height: Int -) \ No newline at end of file +) + +fun BitmapData.getBitmap(): Bitmap { + return Bitmap.createBitmap(createARGBIntArray(), this.width, this.height, Bitmap.Config.HARDWARE) +} + +fun BitmapData.createARGBIntArray(): IntArray { + // hack to get it into correct format by relying on the DIM Sprites methods since we haven't changed the raw pixel data at this point. + val bytes = SpriteData.Sprite.builder().width(this.width).height(this.height).pixelData(this.bitmap).build() + .get24BitRGB() + val result = IntArray(this.width*this.height) + for(i in result.indices) { + val originalIndex = i*3 + val red = bytes[originalIndex].toUInt() and 0xFFu + val green = bytes[originalIndex+1].toUInt() and 0xFFu + val blue = bytes[originalIndex+2].toUInt() and 0xFFu + val alpha = if(red == 0u && blue == 0u && green == 0xFFu) 0 else 0xFF + result[i] = (alpha shl 24) or (red shl 16).toInt() or (green shl 8).toInt() or blue.toInt() + } + return result +} + +fun List.getBitmaps(): List { + return this.map{it.getBitmap()} +} \ No newline at end of file