From 574e3eee702a02756c17e1e33ab8420112a2b8e2 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Mon, 11 Mar 2024 19:27:27 +0100 Subject: [PATCH] Expose `BBHFactory` to record bounds in `Picture` (#889) --- .../kotlin/org/jetbrains/skia/BBHFactory.kt | 28 +++++++++++++++++++ .../org/jetbrains/skia/PictureRecorder.kt | 18 +++++++++--- skiko/src/jvmMain/cpp/common/BBHFactory.cc | 18 ++++++++++++ .../src/jvmMain/cpp/common/PictureRecorder.cc | 5 ++-- skiko/src/nativeJsMain/cpp/BBHFactory.cc | 17 +++++++++++ skiko/src/nativeJsMain/cpp/PictureRecorder.cc | 5 ++-- 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 skiko/src/commonMain/kotlin/org/jetbrains/skia/BBHFactory.kt create mode 100644 skiko/src/jvmMain/cpp/common/BBHFactory.cc create mode 100644 skiko/src/nativeJsMain/cpp/BBHFactory.cc diff --git a/skiko/src/commonMain/kotlin/org/jetbrains/skia/BBHFactory.kt b/skiko/src/commonMain/kotlin/org/jetbrains/skia/BBHFactory.kt new file mode 100644 index 000000000..ab76e32c0 --- /dev/null +++ b/skiko/src/commonMain/kotlin/org/jetbrains/skia/BBHFactory.kt @@ -0,0 +1,28 @@ +package org.jetbrains.skia + +import org.jetbrains.skia.impl.Managed +import org.jetbrains.skia.impl.NativePointer +import org.jetbrains.skia.impl.Stats + +// TODO class BBoxHierarchy internal constructor(ptr: NativePointer) : RefCnt(ptr) + +abstract class BBHFactory internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { + private object _FinalizerHolder { + val PTR = BBHFactory_nGetFinalizer() + } +} + +class RTreeFactory : BBHFactory { + @Suppress("ConvertSecondaryConstructorToPrimary") + constructor() : super(RTreeFactory_nMake()) { + Stats.onNativeCall() + } +} + +@ExternalSymbolName("org_jetbrains_skia_RTreeFactory__1nMake") +@ModuleImport("./skiko.mjs", "org_jetbrains_skia_RTreeFactory__1nMake") +private external fun RTreeFactory_nMake(): NativePointer + +@ExternalSymbolName("org_jetbrains_skia_BBHFactory__1nGetFinalizer") +@ModuleImport("./skiko.mjs", "org_jetbrains_skia_BBHFactory_1nGetFinalizer") +private external fun BBHFactory_nGetFinalizer(): NativePointer diff --git a/skiko/src/commonMain/kotlin/org/jetbrains/skia/PictureRecorder.kt b/skiko/src/commonMain/kotlin/org/jetbrains/skia/PictureRecorder.kt index 5f3c0f1b4..dcec9f317 100644 --- a/skiko/src/commonMain/kotlin/org/jetbrains/skia/PictureRecorder.kt +++ b/skiko/src/commonMain/kotlin/org/jetbrains/skia/PictureRecorder.kt @@ -2,9 +2,10 @@ package org.jetbrains.skia import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Managed +import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.Stats +import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.reachabilityBarrier -import org.jetbrains.skia.impl.NativePointer class PictureRecorder internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { companion object { @@ -44,9 +45,10 @@ class PictureRecorder internal constructor(ptr: NativePointer) : Managed(ptr, _F * * @param bounds the cull rect used when recording this picture. Any drawing the falls outside * of this rect is undefined, and may be drawn or it may not. + * @param bbh optional acceleration structure * @return the canvas. */ - fun beginRecording(bounds: Rect): Canvas { + fun beginRecording(bounds: Rect, bbh: BBHFactory? = null): Canvas { return try { Stats.onNativeCall() Canvas( @@ -55,7 +57,8 @@ class PictureRecorder internal constructor(ptr: NativePointer) : Managed(ptr, _F bounds.left, bounds.top, bounds.right, - bounds.bottom + bounds.bottom, + getPtr(bbh) ), false, this ) } finally { @@ -134,7 +137,14 @@ private external fun PictureRecorder_nGetFinalizer(): NativePointer @ExternalSymbolName("org_jetbrains_skia_PictureRecorder__1nBeginRecording") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureRecorder__1nBeginRecording") -private external fun _nBeginRecording(ptr: NativePointer, left: Float, top: Float, right: Float, bottom: Float): NativePointer +private external fun _nBeginRecording( + ptr: NativePointer, + left: Float, + top: Float, + right: Float, + bottom: Float, + bbh: NativePointer +): NativePointer @ExternalSymbolName("org_jetbrains_skia_PictureRecorder__1nGetRecordingCanvas") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureRecorder__1nGetRecordingCanvas") diff --git a/skiko/src/jvmMain/cpp/common/BBHFactory.cc b/skiko/src/jvmMain/cpp/common/BBHFactory.cc new file mode 100644 index 000000000..ef73e8c6d --- /dev/null +++ b/skiko/src/jvmMain/cpp/common/BBHFactory.cc @@ -0,0 +1,18 @@ +#include +#include "interop.hh" +#include "SkBBHFactory.h" + +static void deleteSkBBHFactory(SkBBHFactory* bbh) { + delete bbh; +} + +extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BBHFactoryKt_RTreeFactory_1nMake + (JNIEnv* env, jclass jclass) { + SkRTreeFactory* instance = new SkRTreeFactory(); + return reinterpret_cast(instance); +} + +extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BBHFactoryKt_BBHFactory_1nGetFinalizer + (JNIEnv* env, jclass jclass) { + return static_cast(reinterpret_cast(&deleteSkBBHFactory)); +} diff --git a/skiko/src/jvmMain/cpp/common/PictureRecorder.cc b/skiko/src/jvmMain/cpp/common/PictureRecorder.cc index 72862d7d2..d0be1e5b1 100644 --- a/skiko/src/jvmMain/cpp/common/PictureRecorder.cc +++ b/skiko/src/jvmMain/cpp/common/PictureRecorder.cc @@ -21,9 +21,10 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_PictureRecorderKt_Pic } extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_PictureRecorderKt__1nBeginRecording - (JNIEnv* env, jclass jclass, jlong ptr, jfloat left, jfloat top, jfloat right, jfloat bottom) { + (JNIEnv* env, jclass jclass, jlong ptr, jfloat left, jfloat top, jfloat right, jfloat bottom, jlong bbh) { SkPictureRecorder* instance = reinterpret_cast(static_cast(ptr)); - SkCanvas* canvas = instance->beginRecording(SkRect::MakeLTRB(left, top, right, bottom), nullptr); + SkBBHFactory* factory = reinterpret_cast(static_cast(bbh)); + SkCanvas* canvas = instance->beginRecording(SkRect::MakeLTRB(left, top, right, bottom), factory); return reinterpret_cast(canvas); } diff --git a/skiko/src/nativeJsMain/cpp/BBHFactory.cc b/skiko/src/nativeJsMain/cpp/BBHFactory.cc new file mode 100644 index 000000000..314c7f706 --- /dev/null +++ b/skiko/src/nativeJsMain/cpp/BBHFactory.cc @@ -0,0 +1,17 @@ +#include "common.h" +#include "SkBBHFactory.h" + +static void deleteSkBBHFactory(SkBBHFactory* bbh) { + delete bbh; +} + +SKIKO_EXPORT KNativePointer org_jetbrains_skia_RTreeFactory__1nMake + () { + SkRTreeFactory* instance = new SkRTreeFactory(); + return reinterpret_cast(instance); +} + +SKIKO_EXPORT KNativePointer org_jetbrains_skia_BBHFactory__1nGetFinalizer + () { + return reinterpret_cast((&deleteSkBBHFactory)); +} diff --git a/skiko/src/nativeJsMain/cpp/PictureRecorder.cc b/skiko/src/nativeJsMain/cpp/PictureRecorder.cc index 78f62baef..7f91e847a 100644 --- a/skiko/src/nativeJsMain/cpp/PictureRecorder.cc +++ b/skiko/src/nativeJsMain/cpp/PictureRecorder.cc @@ -20,9 +20,10 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureRecorder__1nGetFinalizer } SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureRecorder__1nBeginRecording - (KNativePointer ptr, KFloat left, KFloat top, KFloat right, KFloat bottom) { + (KNativePointer ptr, KFloat left, KFloat top, KFloat right, KFloat bottom, KNativePointer bbh) { SkPictureRecorder* instance = reinterpret_cast((ptr)); - SkCanvas* canvas = instance->beginRecording(SkRect::MakeLTRB(left, top, right, bottom), nullptr); + SkBBHFactory* factory = reinterpret_cast(bbh); + SkCanvas* canvas = instance->beginRecording(SkRect::MakeLTRB(left, top, right, bottom), factory); return reinterpret_cast(canvas); }