core: Change Player::new to take in a SwfMovie, not &[u8]

This commit is contained in:
Nathan Adams 2020-05-04 21:37:06 +02:00 committed by Mike Welsh
parent 2331b49ea4
commit 51d9f3ef36
5 changed files with 22 additions and 9 deletions

View File

@ -148,9 +148,9 @@ impl Player {
audio: Audio,
navigator: Navigator,
input: Input,
swf_data: Vec<u8>,
movie: SwfMovie,
) -> Result<Arc<Mutex<Self>>, Error> {
let movie = Arc::new(SwfMovie::from_data(&swf_data)?);
let movie = Arc::new(movie);
info!(
"{}x{}",

View File

@ -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<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
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<Self, Error> {
let swf_stream = swf::read::read_swf_header(&swf_data[..])?;

View File

@ -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<String, Error> {
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 {

View File

@ -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<dyn std::error::Error>> {
let swf_data = std::fs::read(&input_path)?;
let movie = SwfMovie::from_path(&input_path)?;
let event_loop: EventLoop<RuffleEvent> = EventLoop::with_user_event();
let window = Rc::new(
@ -78,7 +79,7 @@ fn run_player(input_path: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
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<u32> = {
let mut player_lock = player.lock().unwrap();

View File

@ -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);