Skip to content

Commit 49745c4

Browse files
committed
web: Use CanvasFontRenderer when enabled
When DeviceFontRenderer::Canvas is set, no fonts will be set up, and instead CanvasFontRenderer will be used to render all device fonts.
1 parent 1bba5ab commit 49745c4

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

web/src/builder.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -688,10 +688,16 @@ impl RuffleInstanceBuilder {
688688
.with_fs_commands(interface);
689689
}
690690

691-
let trace_observer = Rc::new(RefCell::new(JsValue::UNDEFINED));
691+
let trace_observer: Rc<RefCell<JsValue>> = Rc::new(RefCell::new(JsValue::UNDEFINED));
692+
let use_canvas_font_renderer =
693+
matches!(self.device_font_renderer, DeviceFontRenderer::Canvas);
692694
let core = builder
693695
.with_log(log_adapter::WebLogBackend::new(trace_observer.clone()))
694-
.with_ui(ui::WebUiBackend::new(js_player.clone(), &canvas))
696+
.with_ui(ui::WebUiBackend::new(
697+
js_player.clone(),
698+
&canvas,
699+
use_canvas_font_renderer,
700+
))
695701
// `ExternalVideoBackend` has an internal `SoftwareVideoBackend` that it uses for any non-H.264 video.
696702
.with_video(ExternalVideoBackend::new_with_webcodecs(
697703
log_subscriber.clone(),
@@ -724,7 +730,10 @@ impl RuffleInstanceBuilder {
724730
core.set_show_menu(self.show_menu);
725731
core.set_allow_fullscreen(self.allow_fullscreen);
726732
core.set_window_mode(self.wmode.as_deref().unwrap_or("window"));
727-
self.setup_fonts(&mut core);
733+
734+
if matches!(self.device_font_renderer, DeviceFontRenderer::Embedded) {
735+
self.setup_fonts(&mut core);
736+
}
728737
}
729738

730739
Ok(BuiltPlayer {

web/src/ui.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,16 @@ pub struct WebUiBackend {
148148

149149
/// Is a dialog currently open
150150
dialog_open: bool,
151+
152+
use_canvas_font_renderer: bool,
151153
}
152154

153155
impl WebUiBackend {
154-
pub fn new(js_player: JavascriptPlayer, canvas: &HtmlCanvasElement) -> Self {
156+
pub fn new(
157+
js_player: JavascriptPlayer,
158+
canvas: &HtmlCanvasElement,
159+
use_canvas_font_renderer: bool,
160+
) -> Self {
155161
let window = web_sys::window().expect("window()");
156162
let preferred_language = window.navigator().language();
157163
let language = preferred_language
@@ -165,6 +171,7 @@ impl WebUiBackend {
165171
language,
166172
clipboard_content: "".into(),
167173
dialog_open: false,
174+
use_canvas_font_renderer,
168175
}
169176
}
170177

@@ -299,9 +306,39 @@ impl UiBackend for WebUiBackend {
299306
self.js_player.display_unsupported_video(url.as_str());
300307
}
301308

302-
fn load_device_font(&self, _query: &FontQuery, _register: &mut dyn FnMut(FontDefinition)) {
303-
// Because fonts must be loaded instantly (no async),
304-
// we actually just provide them all upfront at time of Player creation.
309+
fn load_device_font(&self, query: &FontQuery, register: &mut dyn FnMut(FontDefinition)) {
310+
if !self.use_canvas_font_renderer {
311+
// In case we don't use the canvas font renderer,
312+
// because fonts must be loaded instantly (no async),
313+
// we actually just provide them all upfront at time of Player creation.
314+
return;
315+
}
316+
317+
let renderer =
318+
font_renderer::CanvasFontRenderer::new(query.is_italic, query.is_bold, &query.name);
319+
320+
match renderer {
321+
Ok(renderer) => {
322+
tracing::info!(
323+
"Loaded a new canvas font renderer for font \"{}\", italic: {}, bold: {}",
324+
query.name,
325+
query.is_italic,
326+
query.is_bold
327+
);
328+
register(FontDefinition::ExternalRenderer {
329+
name: query.name.clone(),
330+
is_bold: query.is_bold,
331+
is_italic: query.is_italic,
332+
font_renderer: Box::new(renderer),
333+
});
334+
}
335+
Err(e) => {
336+
tracing::error!(
337+
"Failed to set up canvas font renderer for font \"{}\": {e:?}",
338+
query.name
339+
)
340+
}
341+
}
305342
}
306343

307344
fn sort_device_fonts(

0 commit comments

Comments
 (0)