From 51d9f3ef36c0796895baea03b64854d50e71e38f Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Mon, 4 May 2020 21:37:06 +0200 Subject: [PATCH] core: Change Player::new to take in a SwfMovie, not &[u8] --- core/src/player.rs | 4 ++-- core/src/tag_utils.rs | 7 +++++++ core/tests/regression_tests.rs | 5 +++-- desktop/src/main.rs | 5 +++-- web/src/lib.rs | 10 +++++++--- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/core/src/player.rs b/core/src/player.rs index 53f3b4e5c..6226a896c 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -148,9 +148,9 @@ impl Player { audio: Audio, navigator: Navigator, input: Input, - swf_data: Vec, + movie: SwfMovie, ) -> Result>, Error> { - let movie = Arc::new(SwfMovie::from_data(&swf_data)?); + let movie = Arc::new(movie); info!( "{}x{}", diff --git a/core/src/tag_utils.rs b/core/src/tag_utils.rs index c8f070565..9a12e11bc 100644 --- a/core/src/tag_utils.rs +++ b/core/src/tag_utils.rs @@ -1,4 +1,5 @@ use gc_arena::Collect; +use std::path::Path; use std::sync::Arc; use swf::{Header, TagCode}; @@ -41,6 +42,12 @@ impl SwfMovie { } } + /// Utility method to construct a movie from a file on disk. + pub fn from_path>(path: P) -> Result { + let data = std::fs::read(path)?; + Self::from_data(&data) + } + /// Construct a movie based on the contents of the SWF datastream. pub fn from_data(swf_data: &[u8]) -> Result { let swf_stream = swf::read::read_swf_header(&swf_data[..])?; diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 246c54b7d..b009ca913 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -8,6 +8,7 @@ use ruffle_core::backend::navigator::{NullExecutor, NullNavigatorBackend}; use ruffle_core::backend::{ audio::NullAudioBackend, input::NullInputBackend, render::NullRenderer, }; +use ruffle_core::tag_utils::SwfMovie; use ruffle_core::Player; use std::cell::RefCell; use std::path::Path; @@ -280,14 +281,14 @@ fn run_swf(swf_path: &str, num_frames: u32) -> Result { let _ = log::set_logger(&TRACE_LOGGER).map(|()| log::set_max_level(log::LevelFilter::Info)); let base_path = Path::new(swf_path).parent().unwrap(); - let swf_data = std::fs::read(swf_path)?; let (mut executor, channel) = NullExecutor::new(); + let movie = SwfMovie::from_path(swf_path)?; let player = Player::new( Box::new(NullRenderer), Box::new(NullAudioBackend::new()), Box::new(NullNavigatorBackend::with_base_path(base_path, channel)), Box::new(NullInputBackend::new()), - swf_data, + movie, )?; for _ in 0..num_frames { diff --git a/desktop/src/main.rs b/desktop/src/main.rs index c0abfc377..8f1b11575 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -18,6 +18,7 @@ use std::path::PathBuf; use std::time::Instant; use structopt::StructOpt; +use ruffle_core::tag_utils::SwfMovie; use std::rc::Rc; use winit::dpi::{LogicalSize, PhysicalPosition}; use winit::event::{ElementState, MouseButton, WindowEvent}; @@ -45,7 +46,7 @@ fn main() { } fn run_player(input_path: PathBuf) -> Result<(), Box> { - let swf_data = std::fs::read(&input_path)?; + let movie = SwfMovie::from_path(&input_path)?; let event_loop: EventLoop = EventLoop::with_user_event(); let window = Rc::new( @@ -78,7 +79,7 @@ fn run_player(input_path: PathBuf) -> Result<(), Box> { event_loop.create_proxy(), )); //TODO: actually implement this backend type let input = Box::new(input::WinitInputBackend::new(window.clone())); - let player = Player::new(renderer, audio, navigator, input, swf_data)?; + let player = Player::new(renderer, audio, navigator, input, movie)?; let logical_size: LogicalSize = { let mut player_lock = player.lock().unwrap(); diff --git a/web/src/lib.rs b/web/src/lib.rs index d0c7c6000..d4edf2ea3 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -7,6 +7,7 @@ use crate::{audio::WebAudioBackend, input::WebInputBackend, navigator::WebNaviga use generational_arena::{Arena, Index}; use js_sys::Uint8Array; use ruffle_core::backend::render::RenderBackend; +use ruffle_core::tag_utils::SwfMovie; use ruffle_core::PlayerEvent; use std::mem::drop; use std::sync::{Arc, Mutex}; @@ -97,8 +98,11 @@ impl Ruffle { console_error_panic_hook::set_once(); let _ = console_log::init_with_level(log::Level::Trace); - let mut data = vec![0; swf_data.length() as usize]; - swf_data.copy_to(&mut data[..]); + let movie = { + let mut data = vec![0; swf_data.length() as usize]; + swf_data.copy_to(&mut data[..]); + SwfMovie::from_data(&data)? + }; let window = web_sys::window().ok_or_else(|| "Expected window")?; let renderer = create_renderer(&canvas)?; @@ -106,7 +110,7 @@ impl Ruffle { let navigator = Box::new(WebNavigatorBackend::new()); let input = Box::new(WebInputBackend::new(&canvas)); - let core = ruffle_core::Player::new(renderer, audio, navigator, input, data)?; + let core = ruffle_core::Player::new(renderer, audio, navigator, input, movie)?; let mut core_lock = core.lock().unwrap(); let frame_rate = core_lock.frame_rate(); core_lock.audio_mut().set_frame_rate(frame_rate);