Unverified Commit 50d76ce2 authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Implement native methods of Pixmap (#352)

parent 0f45ab4e
package org.jetbrains.skia
import org.jetbrains.skia.impl.*
import org.jetbrains.skiko.maybeSynchronized
class Pixmap internal constructor(ptr: NativePointer, managed: Boolean) :
Managed(ptr, _FinalizerHolder.PTR, managed) {
......@@ -11,26 +12,35 @@ class Pixmap internal constructor(ptr: NativePointer, managed: Boolean) :
*/
private var underlyingMemoryOwner: Managed? = null
private var _imageInfo: ImageInfo ? = null
private val _imageInfoLock = Unit
constructor() : this(_nMakeNull(), true) {
Stats.onNativeCall()
}
fun reset() {
Stats.onNativeCall()
Pixmap_nReset(_ptr)
maybeSynchronized(_imageInfoLock) {
_imageInfo = null
Pixmap_nReset(_ptr)
}
underlyingMemoryOwner = null
reachabilityBarrier(this)
}
fun reset(info: ImageInfo, addr: NativePointer, rowBytes: Int, underlyingMemoryOwner: Managed? = null) {
Stats.onNativeCall()
_nResetWithInfo(
_ptr,
info.width, info.height,
info.colorInfo.colorType.ordinal,
info.colorInfo.alphaType.ordinal,
getPtr(info.colorInfo.colorSpace), addr, rowBytes
)
maybeSynchronized(_imageInfoLock) {
_imageInfo = null
_nResetWithInfo(
_ptr,
info.width, info.height,
info.colorInfo.colorType.ordinal,
info.colorInfo.alphaType.ordinal,
getPtr(info.colorInfo.colorSpace), addr, rowBytes
)
}
this.underlyingMemoryOwner = underlyingMemoryOwner
reachabilityBarrier(this)
reachabilityBarrier(info.colorInfo.colorSpace)
......@@ -42,14 +52,16 @@ class Pixmap internal constructor(ptr: NativePointer, managed: Boolean) :
fun setColorSpace(colorSpace: ColorSpace?) {
Stats.onNativeCall()
_nSetColorSpace(_ptr, getPtr(colorSpace))
maybeSynchronized(_imageInfoLock) {
_imageInfo = null
_nSetColorSpace(_ptr, getPtr(colorSpace))
}
reachabilityBarrier(this)
reachabilityBarrier(colorSpace)
}
fun extractSubset(subsetPtr: NativePointer, area: IRect): Boolean {
return try {
Stats.onNativeCall()
Pixmap_nExtractSubset(
_ptr,
subsetPtr,
......@@ -71,7 +83,15 @@ class Pixmap internal constructor(ptr: NativePointer, managed: Boolean) :
get() {
Stats.onNativeCall()
return try {
_nGetInfo(_ptr)
maybeSynchronized(_imageInfoLock) {
if (_imageInfo == null) {
_imageInfo = ImageInfo.createUsing(
_ptr = _ptr,
_nGetImageInfo = ::_nGetInfo
)
}
_imageInfo!!
}
} finally {
reachabilityBarrier(this)
}
......@@ -185,25 +205,31 @@ class Pixmap internal constructor(ptr: NativePointer, managed: Boolean) :
fun readPixels(pixmap: Pixmap?): Boolean {
Stats.onNativeCall()
return try {
_nReadPixelsToPixmap(
_ptr,
getPtr(pixmap)
)
maybeSynchronized(_imageInfoLock) {
_imageInfo = null
_nReadPixelsToPixmap(
_ptr,
getPtr(pixmap)
)
}
} finally {
reachabilityBarrier(this)
reachabilityBarrier(pixmap)
}
}
fun readPixels(pixmap: Pixmap?, srcX: Int, srcY: Int): Boolean {
fun readPixels(pixmap: Pixmap, srcX: Int, srcY: Int): Boolean {
Stats.onNativeCall()
return try {
_nReadPixelsToPixmapFromPoint(
_ptr,
getPtr(pixmap),
srcX,
srcY
)
maybeSynchronized(pixmap._imageInfoLock) {
pixmap._imageInfo = null
_nReadPixelsToPixmapFromPoint(
_ptr,
getPtr(pixmap),
srcX,
srcY
)
}
} finally {
reachabilityBarrier(this)
reachabilityBarrier(pixmap)
......@@ -341,7 +367,7 @@ private external fun _nResetWithInfo(
private external fun _nSetColorSpace(ptr: NativePointer, colorSpacePtr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_Pixmap__1nGetInfo")
private external fun _nGetInfo(ptr: NativePointer): ImageInfo
private external fun _nGetInfo(ptr: NativePointer, imageInfo: InteropPointer, colorSpacePtrs: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Pixmap__1nGetAddr")
private external fun _nGetAddr(ptr: NativePointer): NativePointer
......
package org.jetbrains.skia
import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
class PixmapTest {
@Test
fun canCreate() = runTest {
val pixmap = Pixmap.make(
info = ImageInfo.makeN32(8, 8, ColorAlphaType.UNPREMUL),
buffer = Data.makeFromResource("./colors_8x8.png"),
rowBytes = 8,
)
assertEquals(8, pixmap.info.width)
assertEquals(8, pixmap.info.height)
assertFalse(pixmap.computeIsOpaque())
}
}
\ No newline at end of file
......@@ -64,11 +64,14 @@ extern "C" {
return pixmap->extractSubset(dst, { l, t, w, h });
}
JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_PixmapKt__1nGetInfo
(JNIEnv *env, jclass klass, jlong ptr) {
SkPixmap* pixmap = jlongToPtr<SkPixmap*>(ptr);
const SkImageInfo& imageInfo = pixmap->info();
return skija::ImageInfo::toJava(env, imageInfo);
JNIEXPORT void JNICALL Java_org_jetbrains_skia_PixmapKt__1nGetInfo
(JNIEnv* env, jclass jclass, jlong ptr, jintArray imageInfoResult, jlongArray colorSpaceResultPtr) {
SkPixmap* instance = reinterpret_cast<SkPixmap*>(static_cast<uintptr_t>(ptr));
SkImageInfo imageInfo = instance->info();
skija::ImageInfo::writeImageInfoForInterop(
env, imageInfo, imageInfoResult, colorSpaceResultPtr
);
}
JNIEXPORT jint JNICALL Java_org_jetbrains_skia_PixmapKt_Pixmap_1nGetRowBytes
......
......@@ -65,9 +65,11 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Pixmap__1nExtractSubset
}
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Pixmap__1nGetInfo
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_Pixmap__1nGetInfo");
SKIKO_EXPORT void org_jetbrains_skia_Pixmap__1nGetInfo
(KNativePointer ptr, KInt* imageInfoResult, KNativePointer* colorSpacePtrsArray) {
SkPixmap* instance = reinterpret_cast<SkPixmap*>(ptr);
SkImageInfo imageInfo = instance->info();
skija::ImageInfo::writeImageInfoForInterop(imageInfo, imageInfoResult, colorSpacePtrsArray);
}
SKIKO_EXPORT KInt org_jetbrains_skia_Pixmap__1nGetRowBytes
......
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