From 4a75f1d4623ae0d825fd575af1e8671240cd1fbe Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 30 May 2025 22:33:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=9A=E8=BF=87=20fc-match?= =?UTF-8?q?=20=E8=8E=B7=E5=8F=96=E5=AD=97=E4=BD=93=E6=97=B6=E6=9C=AA?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=20TTC=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20(#3950)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/setting/FontManager.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/FontManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/FontManager.java index 47c9e68da..bbe121230 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/FontManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/FontManager.java @@ -21,11 +21,15 @@ import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.scene.text.Font; import org.jackhuang.hmcl.Metadata; +import org.jackhuang.hmcl.java.JavaRuntime; import org.jackhuang.hmcl.util.Lazy; import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.SystemUtils; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; @@ -120,15 +124,51 @@ public final class FontManager { return null; try { - String path = SystemUtils.run(fcMatch.toString(), + String result = SystemUtils.run(fcMatch.toString(), ":lang=" + Locale.getDefault().toLanguageTag(), - "--format", "%{file}").trim(); + "--format", "%{family}\\n%{file}").trim(); + + String[] results = result.split("\\n"); + if (results.length != 2 || results[0].isEmpty() || results[1].isEmpty()) { + LOG.warning("Unexpected output from fc-match: " + result); + return null; + } + + String family = results[0].trim(); + String path = results[1]; + Path file = Paths.get(path).toAbsolutePath().normalize(); if (!Files.isRegularFile(file)) { LOG.warning("Font file does not exist: " + path); return null; } + if (JavaRuntime.CURRENT_VERSION >= 9) { + try { + MethodHandle methodHandle = MethodHandles.publicLookup().findStatic(Font.class, "loadFonts", + MethodType.methodType(Font[].class, String.class, double.class)); + + Font[] fonts = (Font[]) methodHandle.invokeExact(file.toUri().toURL().toExternalForm(), DEFAULT_FONT_SIZE); + if (fonts == null) { + LOG.warning("Failed to load font from " + path); + return null; + } else if (fonts.length == 0) { + LOG.warning("No fonts loaded from " + path); + return null; + } + + for (Font font : fonts) { + if (font.getFamily().equalsIgnoreCase(family)) { + return font; + } + } + + LOG.warning(String.format("Family '%s' not found in font file '%s'", family, path)); + return fonts[0]; + } catch (NoSuchMethodException | IllegalAccessException ignored) { + } + } + Font font = Font.loadFont(file.toUri().toURL().toExternalForm(), DEFAULT_FONT_SIZE); if (font == null) LOG.warning("Failed to load font from " + path);