Unverified Commit 21a47543 authored by Shagen Ogandzhanian's avatar Shagen Ogandzhanian Committed by GitHub

Commonize FontCollection::familyNames (#392)

parent 4fbabeb5
...@@ -62,7 +62,7 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -62,7 +62,7 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) {
val fontStyle: FontStyle val fontStyle: FontStyle
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
org.jetbrains.skia.FontStyle(_nGetFontStyle(_ptr)) FontStyle(_nGetFontStyle(_ptr))
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
......
...@@ -5,4 +5,6 @@ expect abstract class RefCnt : Managed { ...@@ -5,4 +5,6 @@ expect abstract class RefCnt : Managed {
protected constructor(ptr: NativePointer, allowClose: Boolean) protected constructor(ptr: NativePointer, allowClose: Boolean)
val refCount: Int val refCount: Int
} }
\ No newline at end of file
expect fun RefCnt_nGetFinalizer(): NativePointer
...@@ -89,12 +89,13 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -89,12 +89,13 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
fun findTypefaces(familyNames: Array<String>?, style: FontStyle): Array<Typeface?> { fun findTypefaces(familyNames: Array<String>?, style: FontStyle): Array<Typeface?> {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val ptrs = interopScope { arrayDecoderScope({ ArrayDecoder(interopScope {
_nFindTypefaces(_ptr, toInterop(familyNames), style._value).fromInteropNativePointerArray() _nFindTypefaces(_ptr, toInterop(familyNames), familyNames?.size ?: 0, style._value)
}, RefCnt_nGetFinalizer()) }) { arrayDecoder ->
(0 until arrayDecoder.size).map { i ->
Typeface(arrayDecoder.release(i))
}.toTypedArray()
} }
val res = arrayOfNulls<Typeface>(ptrs.size)
for (i in 0 until ptrs.size) res[i] = Typeface(ptrs[i])
res
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -157,7 +158,7 @@ private external fun _nSetDefaultFontManager(ptr: NativePointer, fontManagerPtr: ...@@ -157,7 +158,7 @@ private external fun _nSetDefaultFontManager(ptr: NativePointer, fontManagerPtr:
private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces")
private external fun _nFindTypefaces(ptr: NativePointer, familyNames: InteropPointer, fontStyle: Int): InteropPointer private external fun _nFindTypefaces(ptr: NativePointer, familyNames: InteropPointer, len: Int, fontStyle: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar")
private external fun _nDefaultFallbackChar(ptr: NativePointer, unicode: Int, fontStyle: Int, locale: String?): NativePointer private external fun _nDefaultFallbackChar(ptr: NativePointer, unicode: Int, fontStyle: Int, locale: String?): NativePointer
......
package org.jetbrains.skia.paragraph
import org.jetbrains.skia.FontMgr
import org.jetbrains.skia.FontStyle
import org.jetbrains.skia.Typeface
import org.jetbrains.skia.impl.use
import org.jetbrains.skia.paragraph.FontCollection
import org.jetbrains.skia.paragraph.TypefaceFontProvider
import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.tests.SkipJsTarget
import org.jetbrains.skiko.tests.SkipNativeTarget
import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals
class FontCollectionTest {
@Test
fun fontCollectionTest() = runTest {
val fm = TypefaceFontProvider()
val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf", 0)
fm.registerTypeface(jbMono)
FontCollection().use { fontCollection ->
fontCollection.setAssetFontManager(fm)
val typefaces = fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.ITALIC)
typefaces.first()!!.let { typeface ->
assertEquals("JetBrains Mono", typeface.familyName)
assertEquals(FontStyle.NORMAL, typeface.fontStyle)
}
}
}
}
\ No newline at end of file
...@@ -19,10 +19,10 @@ actual abstract class RefCnt : Managed { ...@@ -19,10 +19,10 @@ actual abstract class RefCnt : Managed {
} }
private object _FinalizerHolder { private object _FinalizerHolder {
val PTR = _nGetFinalizer() val PTR = RefCnt_nGetFinalizer()
} }
@ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getFinalizer") @ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getFinalizer")
private external fun _nGetFinalizer(): NativePointer actual external fun RefCnt_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getRefCount") @ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getRefCount")
private external fun _nGetRefCount(ptr: NativePointer): Int private external fun _nGetRefCount(ptr: NativePointer): Int
...@@ -59,26 +59,17 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollect ...@@ -59,26 +59,17 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollect
return reinterpret_cast<jlong>(instance->getFallbackManager().release()); return reinterpret_cast<jlong>(instance->getFallbackManager().release());
} }
extern "C" JNIEXPORT jlongArray JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nFindTypefaces extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nFindTypefaces
(JNIEnv* env, jclass jclass, jlong ptr, jobjectArray familyNamesArray, jint fontStyle) { (JNIEnv* env, jclass jclass, jlong ptr, jobjectArray familyNamesArray, jsize len, jint fontStyle) {
FontCollection* instance = reinterpret_cast<FontCollection*>(static_cast<uintptr_t>(ptr)); FontCollection* instance = reinterpret_cast<FontCollection*>(static_cast<uintptr_t>(ptr));
jsize len = env->GetArrayLength(familyNamesArray); vector<sk_sp<SkTypeface>> found = instance->findTypefaces(skStringVector(env, familyNamesArray), skija::FontStyle::fromJava(fontStyle));
vector<SkString> familyNames(len);
for (int i = 0; i < len; ++i) {
jstring str = static_cast<jstring>(env->GetObjectArrayElement(familyNamesArray, i));
familyNames.push_back(skString(env, str));
env->DeleteLocalRef(str);
}
vector<sk_sp<SkTypeface>> found = instance->findTypefaces(familyNames, skija::FontStyle::fromJava(fontStyle)); std::vector<jlong>* res = new std::vector<jlong>();
vector<jlong> res(found.size()); for (auto& f : found)
for (int i = 0; i < found.size(); ++i) res->push_back(reinterpret_cast<jlong>(f.release()));
res[i] = reinterpret_cast<jlong>(found[i].release());
jlongArray resArray = env->NewLongArray((jsize) found.size()); return reinterpret_cast<jlong>(res);
env->SetLongArrayRegion(resArray, 0, (jsize) found.size(), res.data());
return resArray;
} }
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nDefaultFallbackChar extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nDefaultFallbackChar
......
...@@ -29,4 +29,6 @@ actual abstract class RefCnt : Managed { ...@@ -29,4 +29,6 @@ actual abstract class RefCnt : Managed {
@JvmStatic @JvmStatic
external fun _nGetRefCount(ptr: NativePointer): Int external fun _nGetRefCount(ptr: NativePointer): Int
} }
} }
\ No newline at end of file
actual fun RefCnt_nGetFinalizer() = RefCnt._nGetFinalizer()
\ No newline at end of file
...@@ -72,7 +72,7 @@ class FontCollectionTest { ...@@ -72,7 +72,7 @@ class FontCollectionTest {
assertEquals(refCnt + 1, t2.refCount) assertEquals(refCnt + 1, t2.refCount)
assertEquals(t1, t2) assertEquals(t1, t2)
} }
assertEquals(refCnt, t1.refCount)
} }
} }
} }
\ No newline at end of file
...@@ -60,10 +60,21 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nGetFa ...@@ -60,10 +60,21 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nGetFa
return reinterpret_cast<KNativePointer>(instance->getFallbackManager().release()); return reinterpret_cast<KNativePointer>(instance->getFallbackManager().release());
} }
static SkFontStyle fromKotlin(KInt style) {
return SkFontStyle(style & 0xFFFF, (style >> 16) & 0xFF, static_cast<SkFontStyle::Slant>((style >> 24) & 0xFF));
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces
(KNativePointer ptr, KInteropPointerArray familyNamesArray, KInt len, KInt fontStyle) {
FontCollection* instance = reinterpret_cast<FontCollection*>(ptr);
vector<sk_sp<SkTypeface>> found = instance->findTypefaces(skStringVector(familyNamesArray, len), fromKotlin(fontStyle));
std::vector<KNativePointer>* res = new std::vector<KNativePointer>();
for (auto& f : found)
res->push_back(reinterpret_cast<KNativePointer>(f.release()));
SKIKO_EXPORT KNativePointerArray org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces return reinterpret_cast<KNativePointer>(res);
(KNativePointer ptr, KInteropPointerArray familyNamesArray, KInt fontStyle) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces");
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar
......
...@@ -20,11 +20,11 @@ actual abstract class RefCnt : Managed { ...@@ -20,11 +20,11 @@ actual abstract class RefCnt : Managed {
} }
private object _FinalizerHolder { private object _FinalizerHolder {
val PTR = _nGetFinalizer() val PTR = RefCnt_nGetFinalizer()
} }
} }
@ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getFinalizer") @ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getFinalizer")
private external fun _nGetFinalizer(): NativePointer actual external fun RefCnt_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getRefCount") @ExternalSymbolName("org_jetbrains_skia_impl_RefCnt__getRefCount")
private external fun _nGetRefCount(ptr: NativePointer): Int private external fun _nGetRefCount(ptr: NativePointer): Int
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