Skip to content

Commit 1bba5ab

Browse files
committed
web: Add deviceFontRenderer config option
Using this config option the user can select how device fonts should be rendered.
1 parent b2dc3f7 commit 1bba5ab

File tree

5 files changed

+56
-2
lines changed

5 files changed

+56
-2
lines changed

web/packages/core/src/internal/builder.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ export function configureBuilder(
140140
if (isExplicit(config.scrollingBehavior)) {
141141
builder.setScrollingBehavior(config.scrollingBehavior);
142142
}
143+
144+
if (isExplicit(config.deviceFontRenderer)) {
145+
builder.setDeviceFontRenderer(config.deviceFontRenderer);
146+
}
143147
}
144148

145149
/**

web/packages/core/src/public/config/default.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
UnmuteOverlay,
1111
WindowMode,
1212
ScrollingBehavior,
13+
DeviceFontRenderer,
1314
} from "./load-options";
1415

1516
export const DEFAULT_CONFIG: Required<BaseLoadOptions> = {
@@ -56,4 +57,5 @@ export const DEFAULT_CONFIG: Required<BaseLoadOptions> = {
5657
gamepadButtonMapping: {},
5758
urlRewriteRules: [],
5859
scrollingBehavior: ScrollingBehavior.Smart,
60+
deviceFontRenderer: DeviceFontRenderer.Embedded,
5961
};

web/packages/core/src/public/config/load-options.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,30 @@ export enum ScrollingBehavior {
283283
Smart = "smart",
284284
}
285285

286+
/**
287+
* Specifies how device fonts should be rendered.
288+
*/
289+
export enum DeviceFontRenderer {
290+
/**
291+
* Use Ruffle's embedded text rendering engine.
292+
*
293+
* It cannot access device fonts and uses fonts provided in the
294+
* configuration and the default Noto Sans font as a fallback.
295+
*
296+
* This is the default method.
297+
*/
298+
Embedded = "embedded",
299+
300+
/**
301+
* Use an offscreen canvas for text rendering.
302+
*
303+
* It can access and render device fonts, glyphs are rendered as bitmaps.
304+
*
305+
* This is an experimental method and some features might not work properly.
306+
*/
307+
Canvas = "canvas",
308+
}
309+
286310
/**
287311
* Represents a host, port and proxyUrl. Used when a SWF file tries to use a Socket.
288312
*/
@@ -758,6 +782,13 @@ export interface BaseLoadOptions {
758782
* @default ScrollingBehavior.Smart
759783
*/
760784
scrollingBehavior?: ScrollingBehavior;
785+
786+
/**
787+
* Specify how device fonts should be rendered.
788+
*
789+
* @default DeviceFontRenderer.Embedded
790+
*/
791+
deviceFontRenderer?: DeviceFontRenderer;
761792
}
762793

763794
/**

web/src/builder.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::external_interface::JavascriptInterface;
22
use crate::navigator::{OpenUrlMode, WebNavigatorBackend};
33
use crate::{
4-
JavascriptPlayer, RUFFLE_GLOBAL_PANIC, RuffleHandle, ScrollingBehavior, SocketProxy, audio,
5-
log_adapter, storage, ui,
4+
DeviceFontRenderer, JavascriptPlayer, RUFFLE_GLOBAL_PANIC, RuffleHandle, ScrollingBehavior,
5+
SocketProxy, audio, log_adapter, storage, ui,
66
};
77
use js_sys::{Promise, RegExp};
88
use ruffle_core::backend::audio::{AudioBackend, NullAudioBackend};
@@ -65,6 +65,7 @@ pub struct RuffleInstanceBuilder {
6565
pub(crate) gamepad_button_mapping: HashMap<GamepadButton, KeyCode>,
6666
pub(crate) url_rewrite_rules: Vec<(RegExp, String)>,
6767
pub(crate) scrolling_behavior: ScrollingBehavior,
68+
pub(crate) device_font_renderer: DeviceFontRenderer,
6869
}
6970

7071
impl Default for RuffleInstanceBuilder {
@@ -104,6 +105,7 @@ impl Default for RuffleInstanceBuilder {
104105
gamepad_button_mapping: HashMap::new(),
105106
url_rewrite_rules: vec![],
106107
scrolling_behavior: ScrollingBehavior::Smart,
108+
device_font_renderer: DeviceFontRenderer::Embedded,
107109
}
108110
}
109111
}
@@ -347,6 +349,15 @@ impl RuffleInstanceBuilder {
347349
};
348350
}
349351

352+
#[wasm_bindgen(js_name = "setDeviceFontRenderer")]
353+
pub fn set_device_font_renderer(&mut self, device_font_renderer: String) {
354+
self.device_font_renderer = match device_font_renderer.as_str() {
355+
"embedded" => DeviceFontRenderer::Embedded,
356+
"canvas" => DeviceFontRenderer::Canvas,
357+
_ => return,
358+
};
359+
}
360+
350361
// TODO: This should be split into two methods that either load url or load data
351362
// Right now, that's done immediately afterwards in TS
352363
pub async fn build(&self, parent: HtmlElement, js_player: JavascriptPlayer) -> Promise {

web/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,12 @@ pub enum ScrollingBehavior {
238238
Smart,
239239
}
240240

241+
#[derive(Debug, Clone, Copy)]
242+
pub enum DeviceFontRenderer {
243+
Embedded,
244+
Canvas,
245+
}
246+
241247
#[wasm_bindgen]
242248
impl RuffleHandle {
243249
/// Stream an arbitrary movie file from (presumably) the Internet.

0 commit comments

Comments
 (0)