Unverified Commit edb89083 authored by Pavel's avatar Pavel Committed by GitHub

Fix segfaults (#561)

* skString c_str contains string encoded in UTF8, but it was treated as UTF16

* ensure that managedString doesn't collect til the end of JNI call, also close manually at the end
parent 62ea4669
...@@ -105,19 +105,20 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -105,19 +105,20 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
fun shape(text: String, font: Font, opts: ShapingOptions, width: Float, offset: Point): TextBlob? { fun shape(text: String, font: Font, opts: ShapingOptions, width: Float, offset: Point): TextBlob? {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val managedString = ManagedString(text) val ptr = ManagedString(text).use { managedString ->
val ptr = interopScope { interopScope {
_nShapeBlob( _nShapeBlob(
_ptr, _ptr,
managedString._ptr, managedString._ptr,
getPtr(font), getPtr(font),
optsFeaturesLen = opts.features?.size ?: 0, optsFeaturesLen = opts.features?.size ?: 0,
optsFeaturesIntArray = arrayOfFontFeaturesToInterop(opts.features), optsFeaturesIntArray = arrayOfFontFeaturesToInterop(opts.features),
optsBooleanProps = opts._booleanPropsToInt(), optsBooleanProps = opts._booleanPropsToInt(),
width = width, width = width,
offsetX = offset.x, offsetX = offset.x,
offsetY = offset.y offsetY = offset.y
) )
}
} }
if (NullPointer == ptr) null else TextBlob(ptr) if (NullPointer == ptr) null else TextBlob(ptr)
} finally { } finally {
......
...@@ -227,7 +227,10 @@ extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Gl ...@@ -227,7 +227,10 @@ extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Gl
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphsCount extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphsCount
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len) { (JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
return instance->countText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16); const jchar* chars = env->GetStringCritical(str, nullptr);
jint result = instance->countText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16);
env->ReleaseStringCritical(str, chars);
return result;
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureText extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureText
...@@ -246,7 +249,10 @@ extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureTex ...@@ -246,7 +249,10 @@ extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureTex
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len, jlong paintPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len, jlong paintPtr) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr)); SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr));
return instance->measureText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint); const jchar* chars = env->GetStringCritical(str, nullptr);
jfloat result = instance->measureText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint);
env->ReleaseStringCritical(str, chars);
return result;
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetWidths extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetWidths
......
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