diff --git a/web/Cargo.toml b/web/Cargo.toml index 33c5399dd..46074f9d0 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -8,8 +8,10 @@ edition = "2018" crate-type = ["cdylib", "rlib"] [features] +default = ["console_error_panic_hook", "console_log", "webgl"] lzma = ["ruffle_core/lzma"] -default = ["console_error_panic_hook", "console_log"] +canvas = ["ruffle_render_canvas"] +webgl = ["ruffle_render_webgl"] [dependencies] byteorder = "1.3.4" @@ -19,9 +21,9 @@ fnv = "1.0.3" generational-arena = "0.2.7" js-sys = "0.3.25" log = "0.4" -ruffle_render_canvas = { path = "../render/canvas" } +ruffle_render_canvas = { path = "../render/canvas", optional = true } ruffle_web_common = { path = "common" } -ruffle_render_webgl = { path = "../render/webgl" } +ruffle_render_webgl = { path = "../render/webgl", optional = true } url = "2.1.1" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.4" diff --git a/web/src/lib.rs b/web/src/lib.rs index 6008cf3a8..d0c7c6000 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -6,9 +6,8 @@ mod navigator; use crate::{audio::WebAudioBackend, input::WebInputBackend, navigator::WebNavigatorBackend}; use generational_arena::{Arena, Index}; use js_sys::Uint8Array; +use ruffle_core::backend::render::RenderBackend; use ruffle_core::PlayerEvent; -use ruffle_render_canvas::WebCanvasRenderBackend; -use ruffle_render_webgl::WebGlRenderBackend; use std::mem::drop; use std::sync::{Arc, Mutex}; use std::{cell::RefCell, error::Error, num::NonZeroI32}; @@ -102,7 +101,7 @@ impl Ruffle { swf_data.copy_to(&mut data[..]); let window = web_sys::window().ok_or_else(|| "Expected window")?; - let renderer = Box::new(WebGlRenderBackend::new(&canvas)?); + let renderer = create_renderer(&canvas)?; let audio = Box::new(WebAudioBackend::new()?); let navigator = Box::new(WebNavigatorBackend::new()); let input = Box::new(WebInputBackend::new(&canvas)); @@ -469,3 +468,24 @@ impl Ruffle { }); } } + +fn create_renderer(canvas: &HtmlCanvasElement) -> Result, Box> { + #[cfg(not(any(feature = "canvas", feature = "webgl")))] + std::compile_error!("You must enable one of the render backend features (e.g., webgl)."); + + #[cfg(feature = "webgl")] + { + if let Ok(renderer) = ruffle_render_webgl::WebGlRenderBackend::new(canvas) { + return Ok(Box::new(renderer)); + } + } + + #[cfg(feature = "canvas")] + { + if let Ok(renderer) = ruffle_render_canvas::WebCanvasRenderBackend::new(canvas) { + return Ok(Box::new(renderer)); + } + } + + Err("Unable to create renderer".into()) +}