2019-04-28 06:08:59 +00:00
|
|
|
use fluster_core::backend::render::web_canvas::WebCanvasRenderBackend;
|
2019-04-28 01:15:43 +00:00
|
|
|
use js_sys::Uint8Array;
|
2019-04-29 20:24:29 +00:00
|
|
|
use std::error::Error;
|
2019-04-28 01:15:43 +00:00
|
|
|
use wasm_bindgen::{prelude::*, JsValue};
|
2019-04-28 06:08:59 +00:00
|
|
|
use web_sys::HtmlCanvasElement;
|
2019-04-28 01:15:43 +00:00
|
|
|
|
|
|
|
#[wasm_bindgen]
|
|
|
|
pub struct Player(fluster_core::Player);
|
|
|
|
|
|
|
|
#[wasm_bindgen]
|
|
|
|
impl Player {
|
2019-04-28 06:08:59 +00:00
|
|
|
pub fn new(canvas: HtmlCanvasElement, swf_data: Uint8Array) -> Result<Player, JsValue> {
|
|
|
|
Player::new_internal(canvas, swf_data).map_err(|_| "Error creating player".into())
|
2019-04-28 01:15:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn tick(&mut self, dt: f64) {
|
|
|
|
self.0.tick(dt);
|
|
|
|
}
|
|
|
|
}
|
2019-04-28 06:08:59 +00:00
|
|
|
|
|
|
|
impl Player {
|
2019-04-29 20:24:29 +00:00
|
|
|
fn new_internal(canvas: HtmlCanvasElement, swf_data: Uint8Array) -> Result<Player, Box<Error>> {
|
2019-04-28 06:08:59 +00:00
|
|
|
let mut data = vec![0; swf_data.length() as usize];
|
|
|
|
swf_data.copy_to(&mut data[..]);
|
|
|
|
|
2019-04-29 20:24:29 +00:00
|
|
|
let renderer = WebCanvasRenderBackend::new(&canvas)?;
|
2019-04-28 06:08:59 +00:00
|
|
|
|
|
|
|
let player = fluster_core::Player::new(Box::new(renderer), data)?;
|
2019-04-29 20:24:29 +00:00
|
|
|
|
|
|
|
// Update canvas size to match player size.
|
|
|
|
canvas.set_width(player.movie_width());
|
|
|
|
canvas.set_height(player.movie_height());
|
|
|
|
|
|
|
|
let style = canvas.style();
|
|
|
|
style
|
|
|
|
.set_property("width", &format!("{}px", player.movie_width()))
|
|
|
|
.map_err(|_| "Unable to set style")?;
|
|
|
|
style
|
|
|
|
.set_property("height", &format!("{}px", player.movie_height()))
|
|
|
|
.map_err(|_| "Unable to set style")?;
|
|
|
|
|
2019-04-28 06:08:59 +00:00
|
|
|
Ok(Player(player))
|
|
|
|
}
|
|
|
|
}
|