diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index f1bfbb695..a852756aa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -21,10 +21,7 @@ import com.google.gson.*; import com.google.gson.annotations.JsonAdapter; import javafx.beans.InvalidationListener; import javafx.beans.Observable; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.IntegerProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableSet; import org.jackhuang.hmcl.util.javafx.ObservableHelper; @@ -57,6 +54,8 @@ public final class GlobalConfig implements Observable { private final BooleanProperty enableOfflineAccount = new SimpleBooleanProperty(false); + private final StringProperty fontAntiAliasing = new SimpleStringProperty(); + private final ObservableSet userJava = FXCollections.observableSet(new LinkedHashSet<>()); private final ObservableSet disabledJava = FXCollections.observableSet(new LinkedHashSet<>()); @@ -131,6 +130,18 @@ public final class GlobalConfig implements Observable { enableOfflineAccount.set(value); } + public StringProperty fontAntiAliasingProperty() { + return fontAntiAliasing; + } + + public String getFontAntiAliasing() { + return fontAntiAliasing.get(); + } + + public void setFontAntiAliasing(String value) { + this.fontAntiAliasing.set(value); + } + public ObservableSet getUserJava() { return userJava; } @@ -146,7 +157,8 @@ public final class GlobalConfig implements Observable { "logRetention", "userJava", "disabledJava", - "enableOfflineAccount" + "enableOfflineAccount", + "fontAntiAliasing" )); @Override @@ -159,6 +171,7 @@ public final class GlobalConfig implements Observable { jsonObject.add("agreementVersion", context.serialize(src.getAgreementVersion())); jsonObject.add("platformPromptVersion", context.serialize(src.getPlatformPromptVersion())); jsonObject.add("logRetention", context.serialize(src.getLogRetention())); + jsonObject.add("fontAntiAliasing", context.serialize(src.getFontAntiAliasing())); if (src.enableOfflineAccount.get()) jsonObject.addProperty("enableOfflineAccount", true); @@ -186,6 +199,7 @@ public final class GlobalConfig implements Observable { config.setPlatformPromptVersion(Optional.ofNullable(obj.get("platformPromptVersion")).map(JsonElement::getAsInt).orElse(0)); config.setLogRetention(Optional.ofNullable(obj.get("logRetention")).map(JsonElement::getAsInt).orElse(20)); config.setEnableOfflineAccount(Optional.ofNullable(obj.get("enableOfflineAccount")).map(JsonElement::getAsBoolean).orElse(false)); + config.setFontAntiAliasing(Optional.ofNullable(obj.get("fontAntiAliasing")).map(JsonElement::getAsString).orElse(null)); JsonElement userJava = obj.get("userJava"); if (userJava != null && userJava.isJsonArray()) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 6b7a5d7bd..b283d27fd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -175,6 +175,18 @@ public final class Controllers { public static void initialize(Stage stage) { LOG.info("Start initializing application"); + if (System.getProperty("prism.lcdtext") == null) { + String fontAntiAliasing = globalConfig().getFontAntiAliasing(); + if ("lcd".equalsIgnoreCase(fontAntiAliasing)) { + LOG.info("Enable sub-pixel antialiasing"); + System.getProperties().put("prism.lcdtext", "true"); + } else if ("gray".equalsIgnoreCase(fontAntiAliasing) + || OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS && SCREEN.getOutputScaleX() > 1) { + LOG.info("Disable sub-pixel antialiasing"); + System.getProperties().put("prism.lcdtext", "false"); + } + } + Controllers.stage = stage; stageSizeChangeListener = o -> { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java index 2cf3f7c3f..b366b07ee 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java @@ -18,11 +18,13 @@ package org.jackhuang.hmcl.ui.main; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXComboBox; import com.jfoenix.controls.JFXTextField; import com.jfoenix.effects.JFXDepthManager; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.binding.When; +import javafx.collections.FXCollections; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.ColorPicker; @@ -34,6 +36,7 @@ import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; +import javafx.scene.text.FontSmoothingType; import org.jackhuang.hmcl.setting.EnumBackgroundImage; import org.jackhuang.hmcl.setting.FontManager; import org.jackhuang.hmcl.setting.Theme; @@ -44,8 +47,11 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; import java.util.Arrays; +import java.util.Locale; +import java.util.Optional; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class PersonalizationPage extends StackPane { @@ -216,6 +222,46 @@ public class PersonalizationPage extends StackPane { fontPane.getContent().add(vbox); } + { + BorderPane fontAntiAliasingPane = new BorderPane(); + { + Label left = new Label(i18n("settings.launcher.font.anti_aliasing")); + BorderPane.setAlignment(left, Pos.CENTER_LEFT); + fontAntiAliasingPane.setLeft(left); + } + + { + @SuppressWarnings("unchecked") + JFXComboBox> cboAntiAliasing = new JFXComboBox<>(FXCollections.observableArrayList( + Optional.empty(), + Optional.of(FontSmoothingType.LCD), + Optional.of(FontSmoothingType.GRAY) + )); + String fontAntiAliasing = globalConfig().getFontAntiAliasing(); + if ("lcd".equalsIgnoreCase(fontAntiAliasing)) { + cboAntiAliasing.setValue(Optional.of(FontSmoothingType.LCD)); + } else if ("gray".equalsIgnoreCase(fontAntiAliasing)) { + cboAntiAliasing.setValue(Optional.of(FontSmoothingType.GRAY)); + } else { + cboAntiAliasing.setValue(Optional.empty()); + } + cboAntiAliasing.setConverter(FXUtils.stringConverter(value -> { + if (value.isPresent()) { + return i18n("settings.launcher.font.anti_aliasing." + value.get().name().toLowerCase(Locale.ROOT)); + } else { + return i18n("settings.launcher.font.anti_aliasing.auto"); + } + })); + FXUtils.onChange(cboAntiAliasing.valueProperty(), value -> + globalConfig().setFontAntiAliasing(value.map(it -> it.name().toLowerCase(Locale.ROOT)) + .orElse(null))); + + fontAntiAliasingPane.setRight(cboAntiAliasing); + } + + fontPane.getContent().add(fontAntiAliasingPane); + } + content.getChildren().addAll(ComponentList.createComponentListTitle(i18n("settings.launcher.font")), fontPane); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 1f7f1c3f3..0d99977a3 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1321,6 +1321,10 @@ settings.launcher.download_source=Download Source settings.launcher.download_source.auto=Automatically Choose Download Sources settings.launcher.enable_game_list=Show instance list in homepage settings.launcher.font=Font +settings.launcher.font.anti_aliasing=Anti-aliasing +settings.launcher.font.anti_aliasing.auto=Auto +settings.launcher.font.anti_aliasing.gray=Grayscale +settings.launcher.font.anti_aliasing.lcd=Sub-pixel settings.launcher.general=General settings.launcher.language=Language (Applies After Restart) settings.launcher.launcher_log.export=Export Launcher Logs diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 8c7c3ddd2..7b2ea8de7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1118,6 +1118,10 @@ settings.launcher.download_source=下載來源 settings.launcher.download_source.auto=自動選取下載來源 settings.launcher.enable_game_list=在首頁內顯示遊戲清單 settings.launcher.font=字體 +settings.launcher.font.anti_aliasing=抗鋸齒 (重啟後生效) +settings.launcher.font.anti_aliasing.auto=自動 +settings.launcher.font.anti_aliasing.gray=灰度 +settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=一般 settings.launcher.language=語言 (重啟後生效) settings.launcher.launcher_log.export=匯出啟動器日誌 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 6bbda64e1..e7059570c 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1128,6 +1128,10 @@ settings.launcher.download_source=下载源 settings.launcher.download_source.auto=自动选择下载源 settings.launcher.enable_game_list=在主页内显示版本列表 settings.launcher.font=字体 +settings.launcher.font.anti_aliasing=抗锯齿 (重启后生效) +settings.launcher.font.anti_aliasing.auto=自动 +settings.launcher.font.anti_aliasing.gray=灰度 +settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=通用 settings.launcher.language=语言 (重启后生效) settings.launcher.launcher_log.export=导出启动器日志