skiko/src/jvmMain/kotlin/org/jetbrains/skia/impl/Native.jvm.kt (95 lines of code) (raw):

package org.jetbrains.skia.impl import java.lang.ref.Reference actual abstract class Native actual constructor(ptr: NativePointer) { internal actual var _ptr: NativePointer actual companion object { actual val NullPointer: NativePointer get() = 0L } actual override fun toString(): String { return javaClass.simpleName + "(_ptr=0x" + _ptr.toString(16) + ")" } override fun equals(other: Any?): Boolean { return try { if (this === other) return true if (null == other) return false if (!javaClass.isInstance(other)) return false val nOther = other as Native if (_ptr == nOther._ptr) true else nativeEquals(nOther) } finally { Reference.reachabilityFence(this) Reference.reachabilityFence(other) } } // FIXME two different pointers might point to equal objects override fun hashCode(): Int { return java.lang.Long.hashCode(_ptr) } internal actual open fun nativeEquals(other: Native?): Boolean { return false } init { if (ptr == NullPointer) throw RuntimeException("Can't wrap nullptr") _ptr = ptr } } internal actual fun reachabilityBarrier(obj: Any?) { Reference.reachabilityFence(obj) } actual typealias NativePointer = Long internal actual typealias InteropPointer = java.lang.Object internal object theScope: InteropScope() internal actual inline fun <T> interopScope(block: InteropScope.() -> T): T { return theScope.block() } @Suppress("RETURN_TYPE_MISMATCH") // Hack to pass nulls as InteropPointer internal actual open class InteropScope actual constructor() { actual fun toInterop(string: String?): InteropPointer = string actual fun toInterop(array: ByteArray?): InteropPointer = array actual fun toInteropForResult(array: ByteArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: ByteArray) {} actual fun toInterop(array: ShortArray?): InteropPointer = array actual fun toInteropForResult(array: ShortArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: ShortArray) {} actual fun toInterop(array: IntArray?): InteropPointer = array actual fun toInteropForResult(array: IntArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: IntArray) {} actual fun toInterop(array: LongArray?): InteropPointer = array actual fun InteropPointer.fromInterop(result: LongArray) {} actual fun toInterop(array: FloatArray?): InteropPointer = array actual fun toInteropForResult(array: FloatArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: FloatArray) {} actual fun toInterop(array: DoubleArray?): InteropPointer = array actual fun toInteropForResult(array: DoubleArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: DoubleArray) {} actual fun toInterop(array: NativePointerArray?): InteropPointer = array?.backing actual fun toInteropForResult(array: NativePointerArray?): InteropPointer = toInterop(array) actual fun InteropPointer.fromInterop(result: NativePointerArray) {} actual fun toInterop(stringArray: Array<String>?): InteropPointer = stringArray actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray = NativePointerArray((this as LongArray).size, this) actual inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T> = this@fromInterop as Array<T> actual fun toInteropForArraysOfPointers(interopPointers: Array<InteropPointer>): InteropPointer = interopPointers actual fun callback(callback: (() -> Unit)?): InteropPointer = callback actual fun intCallback(callback: (() -> Int)?): InteropPointer = callback actual fun nativePointerCallback(callback: (() -> NativePointer)?): InteropPointer = callback actual fun interopPointerCallback(callback: (() -> InteropPointer)?): InteropPointer = callback actual fun booleanCallback(callback: (() -> Boolean)?): InteropPointer = callback actual fun virtual(method: () -> Unit) = callback(method) actual fun virtualInt(method: () -> Int) = intCallback(method) actual fun virtualNativePointer(method: () -> NativePointer) = nativePointerCallback(method) actual fun virtualInteropPointer(method: () -> InteropPointer) = interopPointerCallback(method) actual fun virtualBoolean(method: () -> Boolean) = booleanCallback(method) actual fun release() {} } actual class NativePointerArray constructor(size: Int, internal val backing: LongArray) { actual constructor(size: Int) : this(size, LongArray(size)) actual operator fun get(index: Int): NativePointer { return backing[index] } actual operator fun set(index: Int, value: NativePointer) { backing[index] = value } actual val size: Int get() = backing.size }