Unverified Commit e463c57d authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

Add `fun Image.Companion.makeFromEncoded(nsData: NSData): Image` (#873)

parent 1d380da1
...@@ -428,7 +428,7 @@ private external fun _nMakeFromPixmap(pixmapPtr: NativePointer): NativePointer ...@@ -428,7 +428,7 @@ private external fun _nMakeFromPixmap(pixmapPtr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Image__1nMakeFromEncoded") @ExternalSymbolName("org_jetbrains_skia_Image__1nMakeFromEncoded")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Image__1nMakeFromEncoded") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Image__1nMakeFromEncoded")
private external fun _nMakeFromEncoded(bytes: InteropPointer, encodedLength: Int): NativePointer internal external fun _nMakeFromEncoded(bytes: InteropPointer, encodedLength: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Image__1nEncodeToData") @ExternalSymbolName("org_jetbrains_skia_Image__1nEncodeToData")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Image__1nEncodeToData") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Image__1nEncodeToData")
......
package org.jetbrains.skia
import platform.Foundation.NSData
import kotlin.native.internal.NativePtr
fun Image.Companion.makeFromEncoded(nsData: NSData): Image {
val ptr = nsData.bytes?.rawValue ?: NativePtr.NULL
require(ptr != NativePtr.NULL) { "Failed to Image::makeFromEncoded" }
// skia makes an internal copy of the nsData bytes
val imgPtr = _nMakeFromEncoded(ptr, nsData.length.toInt())
require(imgPtr != NativePtr.NULL) { "Failed to Image::makeFromEncoded" }
return Image(imgPtr)
}
\ No newline at end of file
package org.jetbrains.skia
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.pin
import platform.Foundation.NSData
import platform.Foundation.dataWithBytes
import kotlin.test.Test
import kotlin.test.assertEquals
class ImageTestDarwin {
@Test
fun canCreateFromEncodedNsData() {
val bytes = intArrayOf(
0xCA, 0xDA, 0xCA, 0xC9, 0xA3,
0xAC, 0xA8, 0x89, 0xA7, 0x87,
0x9B, 0xB5, 0xE5, 0x95, 0x46,
0x90, 0x81, 0xC5, 0x71, 0x33,
0x75, 0x55, 0x44, 0x40, 0x30
).map { it.toByte() }.toByteArray()
val imageInfo = ImageInfo(
width = 5, height = 5,
colorType = ColorType.GRAY_8,
alphaType = ColorAlphaType.OPAQUE
)
val image = Image.makeRaster(imageInfo, bytes, 5)
val data = image.encodeToData()!!
val originalBitmap = Bitmap.makeFromImage(image)
val nsData = createNSDataFromByteArray(data.bytes)
val imageFromNsData = Image.makeFromEncoded(nsData)
val bitmapFromNsData = Bitmap.makeFromImage(imageFromNsData)
assertEquals(imageInfo.height, imageFromNsData.imageInfo.height)
assertEquals(imageInfo.width, imageFromNsData.imageInfo.width)
assertEquals(imageInfo.colorAlphaType, imageFromNsData.imageInfo.colorAlphaType)
assertEquals(imageInfo.colorType, imageFromNsData.imageInfo.colorType)
repeat(5) { x ->
repeat(5) { y ->
assertEquals(originalBitmap.getColor(x, y), bitmapFromNsData.getColor(x, y))
}
}
}
}
@OptIn(ExperimentalForeignApi::class)
fun createNSDataFromByteArray(bytes: ByteArray): NSData {
return NSData.dataWithBytes(bytes.pin().addressOf(0), bytes.size.toULong())
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment