Sean Proctor
01/31/2023, 11:53 AMBitmap
to an ImageBitmap
. My first "brilliant" idea was to write an implementation of ImageBitmap
with a backing from KorIM. That didn't work on Android or JVM because they both expect a specific backing. Is there a way around this? Failing that, I guess I need to write a converter from KorIM to Skia for JVM/JS. For JVM, I can use AWT as an interim format, but I don't think JS has anything similar.Sean Proctor
01/31/2023, 12:00 PMval bitmap: Bitmap32 = ...
Image(bitmap.toComposeImageBitmap(), contentDescription = ..)
where toComposeImageBitmap()
creates an ImageBitmap
backed by the Korim bitmap.Sean Proctor
01/31/2023, 12:00 PMSean Proctor
01/31/2023, 12:02 PMImageBitmap
is a fake interface. I'm not sure where else it's used, but not being able to use a custom implementation in Image
means that there's not much reason for being able to implement it.Sean Proctor
01/31/2023, 2:53 PMimport androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asComposeImageBitmap
import com.soywiz.korim.bitmap.Bitmap
import com.soywiz.korim.bitmap.Bitmap32
import org.jetbrains.skia.ColorAlphaType
import org.jetbrains.skia.ColorInfo
import org.jetbrains.skia.ColorType
import org.jetbrains.skia.ImageInfo
internal actual fun Bitmap.toComposeImageBitmap(): ImageBitmap {
return toBMP32IfRequired().toSkiaBitmap().asComposeImageBitmap()
}
internal fun Bitmap32.toSkiaBitmap(): org.jetbrains.skia.Bitmap {
val colorType = ColorType.N32
val alphaType = if (premultiplied) ColorAlphaType.PREMUL else ColorAlphaType.OPAQUE
val skiaColorSpace = null
val colorInfo = ColorInfo(colorType, alphaType, skiaColorSpace)
val imageInfo = ImageInfo(colorInfo, width, height)
val bitmap = org.jetbrains.skia.Bitmap()
val pixels = extractBytes()
bitmap.allocPixels(imageInfo)
bitmap.installPixels(pixels)
return bitmap
}