Unverified Commit 9afdad8a authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Account for style in font interop (#469)

parent 15e9f823
...@@ -213,8 +213,7 @@ private fun toSkikoKey(event: KeyEvent): Int { ...@@ -213,8 +213,7 @@ private fun toSkikoKey(event: KeyEvent): Int {
return key return key
} }
suspend fun java.awt.Font.toSkikoTypeface(): Typeface? { suspend fun java.awt.Font.toSkikoTypeface(fontManager: AwtFontManager = AwtFontManager.DEFAULT): Typeface? {
val file = AwtFontManager.DEFAULT.findFontFile(this) ?: return null val file = fontManager.findFontFile(this) ?: return null
val data = file.readBytes() return Typeface.makeFromData(Data.makeFromFileName(file.absolutePath))
return Typeface.makeFromData(Data.makeFromBytes(data))
} }
\ No newline at end of file
...@@ -8,8 +8,10 @@ import java.io.FileInputStream ...@@ -8,8 +8,10 @@ import java.io.FileInputStream
import java.io.IOException import java.io.IOException
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
private class FontDescriptor(val file: File, val style: Int)
class AwtFontManager(fontPaths: Array<String> = emptyArray()) { class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
private var fontsMap = ConcurrentHashMap<String, File>() private var fontsMap = ConcurrentHashMap<String, MutableList<FontDescriptor>>()
@Volatile @Volatile
private var allFontsCachedImpl = false private var allFontsCachedImpl = false
private val waitChannel = RendezvousBroadcastChannel<Int>() private val waitChannel = RendezvousBroadcastChannel<Int>()
...@@ -81,7 +83,11 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -81,7 +83,11 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
Font.createFont(Font.TRUETYPE_FONT, it) Font.createFont(Font.TRUETYPE_FONT, it)
} }
val name = f.family val name = f.family
fontsMap[name] = file.absoluteFile
val list = fontsMap.computeIfAbsent(name) { mutableListOf() }
synchronized(list) {
list.add(FontDescriptor(file.absoluteFile, f.style))
}
yield() yield()
} catch (e: FontFormatException) { } catch (e: FontFormatException) {
} catch (e: IOException) { } catch (e: IOException) {
...@@ -101,7 +107,10 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -101,7 +107,10 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
*/ */
@DelicateSkikoApi @DelicateSkikoApi
fun findAvailableFontFile(font: Font): File? { fun findAvailableFontFile(font: Font): File? {
return fontsMap[font.family] val list = fontsMap[font.family] ?: return null
return synchronized(list) {
list.find { it.style == font.style } ?: list.firstOrNull()
}?.file
} }
/** /**
...@@ -114,7 +123,7 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -114,7 +123,7 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
*/ */
@DelicateSkikoApi @DelicateSkikoApi
fun listAvailableFontFiles(): List<File> { fun listAvailableFontFiles(): List<File> {
return fontsMap.values.toList() return fontsMap.values.flatMap { it.map { it.file } }.toList()
} }
/** /**
...@@ -123,7 +132,8 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -123,7 +132,8 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
*/ */
suspend fun listFontFiles(): List<File> { suspend fun listFontFiles(): List<File> {
waitAllFontsCached() waitAllFontsCached()
return fontsMap.values.toList() @OptIn(DelicateSkikoApi::class)
return listAvailableFontFiles()
} }
/** /**
...@@ -134,7 +144,8 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -134,7 +144,8 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
*/ */
suspend fun findFontFile(font: Font): File? { suspend fun findFontFile(font: Font): File? {
waitAllFontsCached() waitAllFontsCached()
return fontsMap[font.family] @OptIn(DelicateSkikoApi::class)
return findAvailableFontFile(font)
} }
/** /**
...@@ -145,7 +156,10 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) { ...@@ -145,7 +156,10 @@ class AwtFontManager(fontPaths: Array<String> = emptyArray()) {
*/ */
suspend fun findFontFamilyFile(family: String): File? { suspend fun findFontFamilyFile(family: String): File? {
waitAllFontsCached() waitAllFontsCached()
return fontsMap[family] val list = fontsMap[family] ?: return null
return synchronized(list) {
list.firstOrNull()
}?.file
} }
/** /**
......
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