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) {
val fontStyle: FontStyle
get() = try {
Stats.onNativeCall()
org.jetbrains.skia.FontStyle(_nGetFontStyle(_ptr))
FontStyle(_nGetFontStyle(_ptr))
} finally {
reachabilityBarrier(this)
}
......
......@@ -6,3 +6,5 @@ expect abstract class RefCnt : Managed {
val refCount: Int
}
expect fun RefCnt_nGetFinalizer(): NativePointer
......@@ -89,12 +89,13 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
fun findTypefaces(familyNames: Array<String>?, style: FontStyle): Array<Typeface?> {
return try {
Stats.onNativeCall()
val ptrs = interopScope {
_nFindTypefaces(_ptr, toInterop(familyNames), style._value).fromInteropNativePointerArray()
arrayDecoderScope({ ArrayDecoder(interopScope {
_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 {
reachabilityBarrier(this)
}
......@@ -157,7 +158,7 @@ private external fun _nSetDefaultFontManager(ptr: NativePointer, fontManagerPtr:
private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer
@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")
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 {
}
private object _FinalizerHolder {
val PTR = _nGetFinalizer()
val PTR = RefCnt_nGetFinalizer()
}
@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")
private external fun _nGetRefCount(ptr: NativePointer): Int
......@@ -59,26 +59,17 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollect
return reinterpret_cast<jlong>(instance->getFallbackManager().release());
}
extern "C" JNIEXPORT jlongArray JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nFindTypefaces
(JNIEnv* env, jclass jclass, jlong ptr, jobjectArray familyNamesArray, jint fontStyle) {
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nFindTypefaces
(JNIEnv* env, jclass jclass, jlong ptr, jobjectArray familyNamesArray, jsize len, jint fontStyle) {
FontCollection* instance = reinterpret_cast<FontCollection*>(static_cast<uintptr_t>(ptr));
jsize len = env->GetArrayLength(familyNamesArray);
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(skStringVector(env, familyNamesArray), skija::FontStyle::fromJava(fontStyle));
vector<sk_sp<SkTypeface>> found = instance->findTypefaces(familyNames, skija::FontStyle::fromJava(fontStyle));
vector<jlong> res(found.size());
for (int i = 0; i < found.size(); ++i)
res[i] = reinterpret_cast<jlong>(found[i].release());
std::vector<jlong>* res = new std::vector<jlong>();
for (auto& f : found)
res->push_back(reinterpret_cast<jlong>(f.release()));
jlongArray resArray = env->NewLongArray((jsize) found.size());
env->SetLongArrayRegion(resArray, 0, (jsize) found.size(), res.data());
return resArray;
return reinterpret_cast<jlong>(res);
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nDefaultFallbackChar
......
......@@ -30,3 +30,5 @@ actual abstract class RefCnt : Managed {
external fun _nGetRefCount(ptr: NativePointer): Int
}
}
actual fun RefCnt_nGetFinalizer() = RefCnt._nGetFinalizer()
\ No newline at end of file
......@@ -72,7 +72,7 @@ class FontCollectionTest {
assertEquals(refCnt + 1, t2.refCount)
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
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
(KNativePointer ptr, KInteropPointerArray familyNamesArray, KInt fontStyle) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nFindTypefaces");
return reinterpret_cast<KNativePointer>(res);
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar
......
......@@ -20,11 +20,11 @@ actual abstract class RefCnt : Managed {
}
private object _FinalizerHolder {
val PTR = _nGetFinalizer()
val PTR = RefCnt_nGetFinalizer()
}
}
@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")
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