desktop: Use suitable CJK fonts for each language on Windows

This commit is contained in:
nosamu 2023-07-06 02:27:47 -05:00 committed by Nathan Adams
parent 57ede6e1f2
commit c60742428c
2 changed files with 49 additions and 9 deletions

27
Cargo.lock generated
View File

@ -1667,6 +1667,19 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "fontdb"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af8d8cbea8f21307d7e84bca254772981296f058a1d36b461bf4d83a7499fc9e"
dependencies = [
"log",
"memmap2 0.6.2",
"slotmap",
"tinyvec",
"ttf-parser",
]
[[package]] [[package]]
name = "foreign-types" name = "foreign-types"
version = "0.3.2" version = "0.3.2"
@ -2733,6 +2746,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "memmap2"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "memoffset" name = "memoffset"
version = "0.6.5" version = "0.6.5"
@ -3843,6 +3865,7 @@ dependencies = [
"egui-winit", "egui-winit",
"embed-resource", "embed-resource",
"fluent-templates", "fluent-templates",
"fontdb",
"futures", "futures",
"generational-arena", "generational-arena",
"isahc", "isahc",
@ -4202,7 +4225,7 @@ checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09"
dependencies = [ dependencies = [
"ab_glyph", "ab_glyph",
"log", "log",
"memmap2", "memmap2 0.5.10",
"smithay-client-toolkit", "smithay-client-toolkit",
"tiny-skia", "tiny-skia",
] ]
@ -4379,7 +4402,7 @@ dependencies = [
"dlib", "dlib",
"lazy_static", "lazy_static",
"log", "log",
"memmap2", "memmap2 0.5.10",
"nix 0.24.3", "nix 0.24.3",
"pkg-config", "pkg-config",
"wayland-client", "wayland-client",

View File

@ -14,6 +14,7 @@ use ruffle_render_wgpu::utils::{format_list, get_backend_names};
use std::rc::Rc; use std::rc::Rc;
use std::sync::{Arc, MutexGuard}; use std::sync::{Arc, MutexGuard};
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use unic_langid::LanguageIdentifier;
use url::Url; use url::Url;
use winit::dpi::PhysicalSize; use winit::dpi::PhysicalSize;
use winit::event_loop::EventLoop; use winit::event_loop::EventLoop;
@ -83,9 +84,7 @@ impl GuiController {
}, },
); );
let descriptors = Descriptors::new(adapter, device, queue); let descriptors = Descriptors::new(adapter, device, queue);
let system_fonts = load_system_fonts().unwrap_or_default();
let egui_ctx = Context::default(); let egui_ctx = Context::default();
egui_ctx.set_fonts(system_fonts);
if let Some(Theme::Light) = window.theme() { if let Some(Theme::Light) = window.theme() {
egui_ctx.set_visuals(egui::Visuals::light()); egui_ctx.set_visuals(egui::Visuals::light());
} }
@ -104,6 +103,8 @@ impl GuiController {
let egui_renderer = egui_wgpu::Renderer::new(&descriptors.device, surface_format, None, 1); let egui_renderer = egui_wgpu::Renderer::new(&descriptors.device, surface_format, None, 1);
let event_loop = event_loop.create_proxy(); let event_loop = event_loop.create_proxy();
let gui = RuffleGui::new(event_loop, opt.movie_url.clone(), PlayerOptions::from(opt)); let gui = RuffleGui::new(event_loop, opt.movie_url.clone(), PlayerOptions::from(opt));
let system_fonts = load_system_fonts(gui.locale.to_owned()).unwrap_or_default();
egui_ctx.set_fonts(system_fonts);
Ok(Self { Ok(Self {
descriptors: Arc::new(descriptors), descriptors: Arc::new(descriptors),
egui_ctx, egui_ctx,
@ -316,17 +317,33 @@ impl GuiController {
} }
// try to load known unicode supporting fonts to draw cjk characters in egui // try to load known unicode supporting fonts to draw cjk characters in egui
fn load_system_fonts() -> anyhow::Result<egui::FontDefinitions> { fn load_system_fonts(locale: LanguageIdentifier) -> anyhow::Result<egui::FontDefinitions> {
let mut font_database = Database::default(); let mut font_database = Database::default();
font_database.load_system_fonts(); font_database.load_system_fonts();
let system_unicode_fonts = Query { let mut families = Vec::new();
families: &[ if let Some(windows_font) = match locale.language.as_str() {
Family::Name("MS UI Gothic"), // windows "ja" => Some(Family::Name("MS UI Gothic")),
"zh" => Some(match locale.to_string().as_str() {
"zh-CN" => Family::Name("Microsoft YaHei"),
_ => Family::Name("Microsoft JhengHei"),
}),
"ko" => Some(Family::Name("Malgun Gothic")),
_ => None,
} {
families.push(windows_font);
}
families.extend(
[
Family::Name("Arial Unicode MS"), // macos Family::Name("Arial Unicode MS"), // macos
Family::Name("Noto Sans"), // linux Family::Name("Noto Sans"), // linux
Family::SansSerif, Family::SansSerif,
], ]
.iter(),
);
let system_unicode_fonts = Query {
families: &families,
..Query::default() ..Query::default()
}; };