Unverified Commit 20de1c87 authored by Shagen Ogandzhanian's avatar Shagen Ogandzhanian Committed by GitHub

Commonize BreakIterator::setText and BreakIterator::clone (#411)

parent 8aff350d
package org.jetbrains.skia package org.jetbrains.skia
import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.Managed import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Stats import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.interopScope
/** /**
* *
...@@ -258,7 +260,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -258,7 +260,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
*/ */
fun makeCharacterInstance(locale: String? = null): BreakIterator { fun makeCharacterInstance(locale: String? = null): BreakIterator {
Stats.onNativeCall() Stats.onNativeCall()
return BreakIterator(_nMake(0, locale)) // UBRK_CHARACTER return BreakIterator(interopScope { _nMake(0, toInterop(locale)) }) // UBRK_CHARACTER
} }
/** /**
* Returns a new BreakIterator instance for word breaks for the given locale. * Returns a new BreakIterator instance for word breaks for the given locale.
...@@ -268,7 +270,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -268,7 +270,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
*/ */
fun makeWordInstance(locale: String? = null): BreakIterator { fun makeWordInstance(locale: String? = null): BreakIterator {
Stats.onNativeCall() Stats.onNativeCall()
return BreakIterator(_nMake(1, locale)) // UBRK_WORD return BreakIterator(interopScope { _nMake(1, toInterop(locale)).also {
if (it == NullPointer) throw IllegalArgumentException("Cannot create word iterator")
} }) // UBRK_WORD
} }
/** /**
* Returns a new BreakIterator instance for line breaks for the given locale. * Returns a new BreakIterator instance for line breaks for the given locale.
...@@ -278,7 +282,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -278,7 +282,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
*/ */
fun makeLineInstance(locale: String? = null): BreakIterator { fun makeLineInstance(locale: String? = null): BreakIterator {
Stats.onNativeCall() Stats.onNativeCall()
return BreakIterator(_nMake(2, locale)) // UBRK_LINE return BreakIterator(interopScope { _nMake(2, toInterop(locale)).also {
if (it == NullPointer) throw IllegalArgumentException("Cannot create line iterator")
} }) // UBRK_LINE
} }
/** /**
* Returns a new BreakIterator instance for sentence breaks for the given locale. * Returns a new BreakIterator instance for sentence breaks for the given locale.
...@@ -288,7 +294,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -288,7 +294,9 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
*/ */
fun makeSentenceInstance(locale: String? = null): BreakIterator { fun makeSentenceInstance(locale: String? = null): BreakIterator {
Stats.onNativeCall() Stats.onNativeCall()
return BreakIterator(_nMake(3, locale)) // UBRK_SENTENCE return BreakIterator(interopScope { _nMake(3, toInterop(locale)).also {
if (it == NullPointer) throw IllegalArgumentException("Cannot create sentence iterator")
} }) // UBRK_SENTENCE
} }
init { init {
...@@ -299,7 +307,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -299,7 +307,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
internal var _text: U16String? = null internal var _text: U16String? = null
override fun close() { override fun close() {
super.close() super.close()
if (_text != null) _text!!.close() _text?.close()
} }
/** /**
...@@ -502,8 +510,8 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -502,8 +510,8 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
fun setText(text: String?) { fun setText(text: String?) {
try { try {
Stats.onNativeCall() Stats.onNativeCall()
_text = U16String(text) _text?.close()
_nSetText(_ptr, getPtr(_text)) _text = interopScope { U16String(_nSetText(_ptr, toInterop(text?.let { ShortArray(text.length) { text[it].code.toShort() } }), text?.length ?: 0)) }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(_text) reachabilityBarrier(_text)
...@@ -520,7 +528,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin ...@@ -520,7 +528,7 @@ class BreakIterator internal constructor(ptr: NativePointer) : Managed(ptr, _Fin
private external fun BreakIterator_nGetFinalizer(): NativePointer private external fun BreakIterator_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nMake") @ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nMake")
private external fun _nMake(type: Int, locale: String?): NativePointer private external fun _nMake(type: Int, locale: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nClone") @ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nClone")
private external fun _nClone(ptr: NativePointer): NativePointer private external fun _nClone(ptr: NativePointer): NativePointer
...@@ -556,4 +564,4 @@ private external fun _nGetRuleStatus(ptr: NativePointer): Int ...@@ -556,4 +564,4 @@ private external fun _nGetRuleStatus(ptr: NativePointer): Int
private external fun _nGetRuleStatuses(ptr: NativePointer): IntArray private external fun _nGetRuleStatuses(ptr: NativePointer): IntArray
@ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nSetText") @ExternalSymbolName("org_jetbrains_skia_BreakIterator__1nSetText")
private external fun _nSetText(ptr: NativePointer, textPtr: NativePointer) private external fun _nSetText(ptr: NativePointer, textStr: InteropPointer, len: Int): NativePointer
...@@ -2,8 +2,6 @@ package org.jetbrains.skia ...@@ -2,8 +2,6 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.Managed import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
/** /**
...@@ -16,30 +14,10 @@ class U16String internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -16,30 +14,10 @@ class U16String internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
} }
} }
constructor(s: String?) : this(U16String_nMake(s)) {
Stats.onNativeCall()
}
override fun toString(): String {
return try {
Stats.onNativeCall()
U16String_nToString(_ptr)
} finally {
reachabilityBarrier(this)
}
}
private object _FinalizerHolder { private object _FinalizerHolder {
val PTR = U16String_nGetFinalizer() val PTR = U16String_nGetFinalizer()
} }
} }
@ExternalSymbolName("org_jetbrains_skia_U16String__1nMake")
private external fun U16String_nMake(s: String?): NativePointer
@ExternalSymbolName("org_jetbrains_skia_U16String__1nGetFinalizer") @ExternalSymbolName("org_jetbrains_skia_U16String__1nGetFinalizer")
private external fun U16String_nGetFinalizer(): NativePointer private external fun U16String_nGetFinalizer(): NativePointer
\ No newline at end of file
@ExternalSymbolName("org_jetbrains_skia_U16String__1nToString")
private external fun U16String_nToString(ptr: NativePointer): String
...@@ -23,7 +23,6 @@ fun getPtr(n: Native?): NativePointer = n?._ptr ?: Native.NullPointer ...@@ -23,7 +23,6 @@ fun getPtr(n: Native?): NativePointer = n?._ptr ?: Native.NullPointer
expect class InteropScope() { expect class InteropScope() {
fun toInterop(string: String?): InteropPointer fun toInterop(string: String?): InteropPointer
fun InteropPointer.fromInterop(result: CharArray)
fun toInterop(array: ByteArray?): InteropPointer fun toInterop(array: ByteArray?): InteropPointer
fun InteropPointer.fromInterop(result: ByteArray) fun InteropPointer.fromInterop(result: ByteArray)
fun toInterop(array: ShortArray?): InteropPointer fun toInterop(array: ShortArray?): InteropPointer
......
package org.jetbrains.skia
import org.jetbrains.skiko.OS
import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.tests.SkipJsTarget
import kotlin.test.Test
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals
private fun BreakIterator.asSequence() = generateSequence { next().let { n -> if (n == -1) null else n } }
class BreakIteratorTests {
@Test
fun breakIteratorWordInstanceTest() {
// Wasm and iOS builds of Skia do not include required data to implement those iterators,
// see `third_party/externals/icu/flutter/README.md`.
if (hostOs == OS.JS || hostOs == OS.Ios)
return
val boundary = BreakIterator.makeWordInstance()
boundary.setText("家捷克的软件开发公司 ,software development company")
assertContentEquals(listOf(1, 3, 4, 6, 8, 10, 11, 12, 20, 21, 32, 33, 40), boundary.asSequence().toList())
assertEquals(0, boundary.first())
assertEquals(40, boundary.last())
val boundaryCloned = boundary.clone()
assertContentEquals(boundary.asSequence().toList(), boundaryCloned.asSequence().toList())
}
@Test
fun breakIteratorSentenceInstanceTest() {
// Wasm and iOS builds of Skia do not include required data to implement those iterators,
// see `third_party/externals/icu/flutter/README.md`.
if (hostOs == OS.JS)
return
val boundary = BreakIterator.makeSentenceInstance()
boundary.setText("""
Skiko (short for Skia for Kotlin) is the graphical library exposing significant part of Skia library APIs to Kotlin, along with the gluing code for rendering context.
At the moment, Linux(x86_64 and arm64), Windows(x86_64) and macOS(x86_64 and arm64) builds for Kotlin/JVM are available.
""".trimIndent())
assertContentEquals(listOf(167, 287), boundary.asSequence().toList())
}
}
\ No newline at end of file
...@@ -64,11 +64,6 @@ actual class InteropScope actual constructor() { ...@@ -64,11 +64,6 @@ actual class InteropScope actual constructor() {
} }
} }
actual fun InteropPointer.fromInterop(result: CharArray) {
val tmp = UTF8ToString(this@fromInterop)
tmp.toCharArray().copyInto(result)
}
actual fun toInterop(array: ByteArray?): InteropPointer { actual fun toInterop(array: ByteArray?): InteropPointer {
return if (array != null && array.isNotEmpty()) { return if (array != null && array.isNotEmpty()) {
val data = _malloc(array.size) val data = _malloc(array.size)
...@@ -265,6 +260,8 @@ private external fun _malloc(size: Int): NativePointer ...@@ -265,6 +260,8 @@ private external fun _malloc(size: Int): NativePointer
private external fun _free(ptr: NativePointer) private external fun _free(ptr: NativePointer)
private external fun lengthBytesUTF8(str: String): Int
private external fun stringToUTF8(str: String, outPtr: NativePointer, maxBytesToWrite: Int) private external fun stringToUTF8(str: String, outPtr: NativePointer, maxBytesToWrite: Int)
private external fun UTF8ToString(ptr: NativePointer): String private external fun UTF8ToString(ptr: NativePointer): String
...@@ -280,6 +277,7 @@ private external object HEAPU8: HEAP<ByteArray> { ...@@ -280,6 +277,7 @@ private external object HEAPU8: HEAP<ByteArray> {
private external object HEAPU16: HEAP<ShortArray> { private external object HEAPU16: HEAP<ShortArray> {
override fun set(src: ShortArray, dest: NativePointer) override fun set(src: ShortArray, dest: NativePointer)
fun set(src: CharArray, dest: NativePointer)
override fun subarray(startIndex: Int, endIndex: Int): ArrayBufferView override fun subarray(startIndex: Int, endIndex: Int): ArrayBufferView
} }
...@@ -301,6 +299,7 @@ private external object HEAPF64: HEAP<DoubleArray> { ...@@ -301,6 +299,7 @@ private external object HEAPF64: HEAP<DoubleArray> {
// Data copying routines. // Data copying routines.
private fun toWasm(dest: NativePointer, src: ByteArray): Unit = HEAPU8.set(src, dest) private fun toWasm(dest: NativePointer, src: ByteArray): Unit = HEAPU8.set(src, dest)
private fun toWasm(dest: NativePointer, src: ShortArray): Unit = HEAPU16.set(src, dest / 2) private fun toWasm(dest: NativePointer, src: ShortArray): Unit = HEAPU16.set(src, dest / 2)
private fun toWasm(dest: NativePointer, src: CharArray): Unit = HEAPU16.set(src, dest / 2)
private fun toWasm(dest: NativePointer, src: FloatArray): Unit = HEAPF32.set(src, dest / 4) private fun toWasm(dest: NativePointer, src: FloatArray): Unit = HEAPF32.set(src, dest / 4)
private fun toWasm(dest: NativePointer, src: DoubleArray): Unit = HEAPF64.set(src, dest / 8) private fun toWasm(dest: NativePointer, src: DoubleArray): Unit = HEAPF64.set(src, dest / 8)
private fun toWasm(dest: NativePointer, src: IntArray): Unit = HEAPU32.set(src, dest / 4) private fun toWasm(dest: NativePointer, src: IntArray): Unit = HEAPU32.set(src, dest / 4)
......
...@@ -12,18 +12,6 @@ class InteropScopeTests { ...@@ -12,18 +12,6 @@ class InteropScopeTests {
interopScope { } interopScope { }
} }
@Test
fun toInteropString() = runTest {
interopScope {
val s = "HelloWorld!ПриветМир!"
val interopPointer = toInterop(s)
val readArray = CharArray(s.length)
interopPointer.fromInterop(readArray)
assertContentEquals(s.toCharArray(), readArray)
}
}
@Test @Test
fun toInteropFloatArray() = runTest { fun toInteropFloatArray() = runTest {
interopScope { interopScope {
...@@ -96,25 +84,4 @@ class InteropScopeTests { ...@@ -96,25 +84,4 @@ class InteropScopeTests {
assertContentEquals(array, readArray) assertContentEquals(array, readArray)
} }
} }
@Test
fun toInteropStringArray() = runTest {
interopScope {
val array = arrayOf("s1", "s2", "s3")
val interopPointer = toInterop(array)
val npa = NativePointerArray(3)
interopPointer.fromInterop(npa)
val res = generateSequence(0) {
it + 1
}.map {
val charArray = CharArray(2)
npa[it].fromInterop(charArray)
charArray.concatToString()
}.take(3).toList().toTypedArray()
assertContentEquals(array, res)
}
}
} }
...@@ -32,7 +32,7 @@ extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_BreakIteratorKt__1nClo ...@@ -32,7 +32,7 @@ extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_BreakIteratorKt__1nClo
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(static_cast<uintptr_t>(ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(static_cast<uintptr_t>(ptr));
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
UBreakIterator* clone = ubrk_safeClone(instance, nullptr, 0, &status); UBreakIterator* clone = ubrk_clone(instance, &status);
if (U_FAILURE(status)) { if (U_FAILURE(status)) {
env->ThrowNew(java::lang::RuntimeException::cls, u_errorName(status)); env->ThrowNew(java::lang::RuntimeException::cls, u_errorName(status));
return 0; return 0;
...@@ -108,12 +108,17 @@ extern "C" JNIEXPORT jintArray JNICALL Java_org_jetbrains_skia_BreakIteratorKt__ ...@@ -108,12 +108,17 @@ extern "C" JNIEXPORT jintArray JNICALL Java_org_jetbrains_skia_BreakIteratorKt__
return javaIntArray(env, vec); return javaIntArray(env, vec);
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_BreakIteratorKt__1nSetText extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BreakIteratorKt__1nSetText
(JNIEnv* env, jclass jclass, jlong ptr, jlong textPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jcharArray textArr, jint len) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(static_cast<uintptr_t>(ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(static_cast<uintptr_t>(ptr));
std::vector<jchar>* text = reinterpret_cast<std::vector<jchar>*>(static_cast<uintptr_t>(textPtr));
std::vector<jchar>* text = new std::vector<jchar>(len);
env->GetCharArrayRegion(textArr, 0, len, text->data());
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
ubrk_setText(instance, reinterpret_cast<UChar *>(text->data()), text->size(), &status); ubrk_setText(instance, reinterpret_cast<UChar *>(text->data()), len, &status);
if (U_FAILURE(status)) if (U_FAILURE(status))
env->ThrowNew(java::lang::RuntimeException::cls, u_errorName(status)); env->ThrowNew(java::lang::RuntimeException::cls, u_errorName(status));
return reinterpret_cast<jlong>(text);
} }
\ No newline at end of file
...@@ -10,18 +10,4 @@ static void deleteU16String(std::vector<jchar>* instance) { ...@@ -10,18 +10,4 @@ static void deleteU16String(std::vector<jchar>* instance) {
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_U16StringKt_U16String_1nGetFinalizer extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_U16StringKt_U16String_1nGetFinalizer
(JNIEnv* env, jclass jclass) { (JNIEnv* env, jclass jclass) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&deleteU16String)); return static_cast<jlong>(reinterpret_cast<uintptr_t>(&deleteU16String));
} }
\ No newline at end of file
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_U16StringKt_U16String_1nMake
(JNIEnv* env, jclass jclass, jstring str) {
jsize len = env->GetStringLength(str);
std::vector<jchar>* instance = new std::vector<jchar>(len);
env->GetStringRegion(str, 0, len, instance->data());
return reinterpret_cast<jlong>(instance);
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_U16StringKt_U16String_1nToString
(JNIEnv* env, jclass jclass, jlong ptr) {
std::vector<jchar>* instance = reinterpret_cast<std::vector<jchar>*>(static_cast<uintptr_t>(ptr));
return env->NewString(instance->data(), instance->size());
}
...@@ -57,7 +57,6 @@ actual inline fun <T> interopScope(block: InteropScope.() -> T): T { ...@@ -57,7 +57,6 @@ actual inline fun <T> interopScope(block: InteropScope.() -> T): T {
actual open class InteropScope actual constructor() { actual open class InteropScope actual constructor() {
actual fun toInterop(string: String?): InteropPointer = string actual fun toInterop(string: String?): InteropPointer = string
actual fun InteropPointer.fromInterop(result: CharArray) {}
actual fun toInterop(array: ByteArray?): InteropPointer = array actual fun toInterop(array: ByteArray?): InteropPointer = array
actual fun InteropPointer.fromInterop(result: ByteArray) {} actual fun InteropPointer.fromInterop(result: ByteArray) {}
actual fun toInterop(array: ShortArray?): InteropPointer = array actual fun toInterop(array: ShortArray?): InteropPointer = array
......
...@@ -15,67 +15,84 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nGetFinalizer() { ...@@ -15,67 +15,84 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nGetFinalizer() {
SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nMake SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nMake
(KInt type, KInteropPointer localeStr) { (KInt type, KInteropPointer localeStr) {
TODO("implement org_jetbrains_skia_BreakIterator__1nMake"); UErrorCode status = U_ZERO_ERROR;
UBreakIterator* instance;
if (localeStr == nullptr)
instance = ubrk_open(static_cast<UBreakIteratorType>(type), uloc_getDefault(), nullptr, 0, &status);
else {
instance = ubrk_open(static_cast<UBreakIteratorType>(type), skString(localeStr).c_str(), nullptr, 0, &status);
}
if (U_FAILURE(status))
return 0;
else
return reinterpret_cast<KNativePointer>(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nClone SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nClone
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_BreakIterator__1nClone"); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
UErrorCode status = U_ZERO_ERROR;
UBreakIterator* clone = ubrk_clone(instance, &status);
if (U_FAILURE(status)) {
return 0;
} else
return reinterpret_cast<KNativePointer>(clone);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nCurrent SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nCurrent
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_current(instance); return ubrk_current(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nNext SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nNext
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_next(instance); return ubrk_next(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nPrevious SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nPrevious
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_previous(instance); return ubrk_previous(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nFirst SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nFirst
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_first(instance); return ubrk_first(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nLast SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nLast
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_last(instance); return ubrk_last(instance);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nPreceding SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nPreceding
(KNativePointer ptr, KInt offset) { (KNativePointer ptr, KInt offset) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_preceding(instance, offset); return ubrk_preceding(instance, offset);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nFollowing SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nFollowing
(KNativePointer ptr, KInt offset) { (KNativePointer ptr, KInt offset) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_following(instance, offset); return ubrk_following(instance, offset);
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_BreakIterator__1nIsBoundary SKIKO_EXPORT KBoolean org_jetbrains_skia_BreakIterator__1nIsBoundary
(KNativePointer ptr, KInt offset) { (KNativePointer ptr, KInt offset) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_isBoundary(instance, offset); return ubrk_isBoundary(instance, offset);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nGetRuleStatus SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nGetRuleStatus
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
return ubrk_getRuleStatus(instance); return ubrk_getRuleStatus(instance);
} }
...@@ -84,7 +101,7 @@ SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nGetRuleStatus ...@@ -84,7 +101,7 @@ SKIKO_EXPORT KInt org_jetbrains_skia_BreakIterator__1nGetRuleStatus
#if 0 #if 0
SKIKO_EXPORT KInt* org_jetbrains_skia_BreakIterator__1nGetRuleStatuses SKIKO_EXPORT KInt* org_jetbrains_skia_BreakIterator__1nGetRuleStatuses
(KNativePointer ptr) { (KNativePointer ptr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr)); UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
int32_t len = ubrk_getRuleStatusVec(instance, nullptr, 0, &status); int32_t len = ubrk_getRuleStatusVec(instance, nullptr, 0, &status);
if (U_FAILURE(status)) if (U_FAILURE(status))
...@@ -98,21 +115,12 @@ SKIKO_EXPORT KInt* org_jetbrains_skia_BreakIterator__1nGetRuleStatuses ...@@ -98,21 +115,12 @@ SKIKO_EXPORT KInt* org_jetbrains_skia_BreakIterator__1nGetRuleStatuses
#endif #endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_BreakIterator__1nSetText
(KNativePointer ptr, KChar* textArr, KInt len) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>(ptr);
std::vector<UChar>* text = new std::vector<UChar>(textArr, textArr + len);
SKIKO_EXPORT void org_jetbrains_skia_BreakIterator__1nSetText
(KNativePointer ptr, KNativePointer textPtr) {
TODO("implement org_jetbrains_skia_BreakIterator__1nSetText");
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_BreakIterator__1nSetText
(KNativePointer ptr, KNativePointer textPtr) {
UBreakIterator* instance = reinterpret_cast<UBreakIterator*>((ptr));
std::vector<KChar>* text = reinterpret_cast<std::vector<KChar>*>((textPtr));
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
ubrk_setText(instance, reinterpret_cast<UChar *>(text->data()), text->size(), &status); ubrk_setText(instance, text->data(), len, &status);
if (U_FAILURE(status)) return reinterpret_cast<KNativePointer>(text);
env->ThrowNew(java::lang::RuntimeException::cls, u_errorName(status));
} }
#endif
...@@ -10,16 +10,5 @@ static void deleteU16String(std::vector<KChar>* instance) { ...@@ -10,16 +10,5 @@ static void deleteU16String(std::vector<KChar>* instance) {
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_U16String__1nGetFinalizer() { SKIKO_EXPORT KNativePointer org_jetbrains_skia_U16String__1nGetFinalizer() {
return reinterpret_cast<KNativePointer>((&deleteU16String)); return reinterpret_cast<KNativePointer>(&deleteU16String);
} }
\ No newline at end of file
SKIKO_EXPORT KNativePointer org_jetbrains_skia_U16String__1nMake
(KInteropPointer str) {
TODO("implement org_jetbrains_skia_U16String__1nMake");
}
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_U16String__1nToString
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_U16String__1nToString");
}
\ No newline at end of file
...@@ -78,8 +78,6 @@ actual class InteropScope actual constructor() { ...@@ -78,8 +78,6 @@ actual class InteropScope actual constructor() {
} }
} }
actual fun InteropPointer.fromInterop(result: CharArray) {}
actual fun toInterop(array: ByteArray?): InteropPointer { actual fun toInterop(array: ByteArray?): InteropPointer {
return if (array != null && array.isNotEmpty()) { return if (array != null && array.isNotEmpty()) {
val pinned = array.pin() val pinned = array.pin()
......
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