2022-08-13 22:12:24 +00:00
|
|
|
mod null;
|
2022-08-13 22:27:02 +00:00
|
|
|
mod utils;
|
2022-08-13 22:12:24 +00:00
|
|
|
|
|
|
|
pub use null::{NullBitmapSource, NullRenderer};
|
2022-08-13 22:27:02 +00:00
|
|
|
pub use utils::{determine_jpeg_tag_format, remove_invalid_jpeg_data};
|
2022-08-13 22:12:24 +00:00
|
|
|
|
2021-06-08 05:33:37 +00:00
|
|
|
use crate::matrix::Matrix;
|
2020-04-17 10:14:31 +00:00
|
|
|
use crate::shape_utils::DistilledShape;
|
2022-08-13 22:52:16 +00:00
|
|
|
pub use crate::transform::Transform;
|
2020-05-11 07:02:49 +00:00
|
|
|
use downcast_rs::Downcast;
|
2022-08-13 22:52:16 +00:00
|
|
|
use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapInfo, BitmapSource};
|
2019-08-26 23:38:37 +00:00
|
|
|
pub use swf;
|
|
|
|
|
2020-05-11 07:02:49 +00:00
|
|
|
pub trait RenderBackend: Downcast {
|
2019-08-26 23:38:37 +00:00
|
|
|
fn set_viewport_dimensions(&mut self, width: u32, height: u32);
|
2020-12-30 23:35:43 +00:00
|
|
|
fn register_shape(
|
|
|
|
&mut self,
|
|
|
|
shape: DistilledShape,
|
2021-06-13 21:44:16 +00:00
|
|
|
bitmap_source: &dyn BitmapSource,
|
2020-12-30 23:35:43 +00:00
|
|
|
) -> ShapeHandle;
|
|
|
|
fn replace_shape(
|
|
|
|
&mut self,
|
|
|
|
shape: DistilledShape,
|
2021-06-13 21:44:16 +00:00
|
|
|
bitmap_source: &dyn BitmapSource,
|
2020-12-30 23:35:43 +00:00
|
|
|
handle: ShapeHandle,
|
|
|
|
);
|
2019-08-26 23:38:37 +00:00
|
|
|
fn register_glyph_shape(&mut self, shape: &swf::Glyph) -> ShapeHandle;
|
2022-05-27 19:16:33 +00:00
|
|
|
|
2019-08-26 23:38:37 +00:00
|
|
|
fn register_bitmap_jpeg(
|
|
|
|
&mut self,
|
|
|
|
data: &[u8],
|
2019-11-11 21:37:22 +00:00
|
|
|
jpeg_tables: Option<&[u8]>,
|
2022-05-27 19:16:33 +00:00
|
|
|
) -> Result<BitmapInfo, Error> {
|
2022-08-13 22:27:02 +00:00
|
|
|
let data = utils::glue_tables_to_jpeg(data, jpeg_tables);
|
2022-05-27 19:16:33 +00:00
|
|
|
self.register_bitmap_jpeg_2(&data)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn register_bitmap_jpeg_2(&mut self, data: &[u8]) -> Result<BitmapInfo, Error> {
|
2022-08-13 22:27:02 +00:00
|
|
|
let bitmap = utils::decode_define_bits_jpeg(data, None)?;
|
2022-05-27 19:16:33 +00:00
|
|
|
let width = bitmap.width() as u16;
|
|
|
|
let height = bitmap.height() as u16;
|
|
|
|
let handle = self.register_bitmap(bitmap)?;
|
|
|
|
Ok(BitmapInfo {
|
|
|
|
handle,
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-12-04 12:27:51 +00:00
|
|
|
fn register_bitmap_jpeg_3_or_4(
|
2019-08-26 23:38:37 +00:00
|
|
|
&mut self,
|
|
|
|
jpeg_data: &[u8],
|
|
|
|
alpha_data: &[u8],
|
2022-05-27 19:16:33 +00:00
|
|
|
) -> Result<BitmapInfo, Error> {
|
2022-08-13 22:27:02 +00:00
|
|
|
let bitmap = utils::decode_define_bits_jpeg(jpeg_data, Some(alpha_data))?;
|
2022-05-27 19:16:33 +00:00
|
|
|
let width = bitmap.width() as u16;
|
|
|
|
let height = bitmap.height() as u16;
|
|
|
|
let handle = self.register_bitmap(bitmap)?;
|
|
|
|
Ok(BitmapInfo {
|
|
|
|
handle,
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-05-19 10:15:33 +00:00
|
|
|
fn register_bitmap_png(
|
|
|
|
&mut self,
|
|
|
|
swf_tag: &swf::DefineBitsLossless,
|
2022-05-27 19:16:33 +00:00
|
|
|
) -> Result<BitmapInfo, Error> {
|
2022-08-13 22:27:02 +00:00
|
|
|
let bitmap = utils::decode_define_bits_lossless(swf_tag)?;
|
2022-05-27 19:16:33 +00:00
|
|
|
let width = bitmap.width() as u16;
|
|
|
|
let height = bitmap.height() as u16;
|
|
|
|
let handle = self.register_bitmap(bitmap)?;
|
|
|
|
Ok(BitmapInfo {
|
|
|
|
handle,
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
})
|
|
|
|
}
|
2019-08-26 23:38:37 +00:00
|
|
|
|
2022-08-13 22:52:16 +00:00
|
|
|
fn begin_frame(&mut self, clear: swf::Color);
|
2020-12-15 03:18:27 +00:00
|
|
|
fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, smoothing: bool);
|
2019-08-26 23:38:37 +00:00
|
|
|
fn render_shape(&mut self, shape: ShapeHandle, transform: &Transform);
|
2022-08-13 22:52:16 +00:00
|
|
|
fn draw_rect(&mut self, color: swf::Color, matrix: &Matrix);
|
2019-08-26 23:38:37 +00:00
|
|
|
fn end_frame(&mut self);
|
2019-09-08 02:33:06 +00:00
|
|
|
fn push_mask(&mut self);
|
|
|
|
fn activate_mask(&mut self);
|
2020-10-14 18:25:55 +00:00
|
|
|
fn deactivate_mask(&mut self);
|
2019-09-08 02:33:06 +00:00
|
|
|
fn pop_mask(&mut self);
|
2020-10-19 00:25:23 +00:00
|
|
|
|
2020-11-01 18:43:15 +00:00
|
|
|
fn get_bitmap_pixels(&mut self, bitmap: BitmapHandle) -> Option<Bitmap>;
|
2022-05-27 19:16:33 +00:00
|
|
|
fn register_bitmap(&mut self, bitmap: Bitmap) -> Result<BitmapHandle, Error>;
|
2022-06-29 22:16:43 +00:00
|
|
|
// Frees memory used by the bitmap. After this call, `handle` can no longer
|
|
|
|
// be used.
|
|
|
|
fn unregister_bitmap(&mut self, handle: BitmapHandle) -> Result<(), Error>;
|
2020-12-09 18:38:41 +00:00
|
|
|
fn update_texture(
|
|
|
|
&mut self,
|
|
|
|
bitmap: BitmapHandle,
|
|
|
|
width: u32,
|
|
|
|
height: u32,
|
|
|
|
rgba: Vec<u8>,
|
|
|
|
) -> Result<BitmapHandle, Error>;
|
2019-08-26 23:38:37 +00:00
|
|
|
}
|
2020-05-11 07:02:49 +00:00
|
|
|
impl_downcast!(RenderBackend);
|
2019-08-26 23:38:37 +00:00
|
|
|
|
2020-04-29 10:58:29 +00:00
|
|
|
type Error = Box<dyn std::error::Error>;
|
|
|
|
|
2019-08-26 23:38:37 +00:00
|
|
|
#[derive(Copy, Clone, Debug)]
|
|
|
|
pub struct ShapeHandle(pub usize);
|
|
|
|
|
2020-04-29 10:58:29 +00:00
|
|
|
/// The format of image data in a DefineBitsJpeg2/3 tag.
|
|
|
|
/// Generally this will be JPEG, but according to SWF19, these tags can also contain PNG and GIF data.
|
|
|
|
/// SWF19 pp.138-139
|
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
|
|
|
pub enum JpegTagFormat {
|
|
|
|
Jpeg,
|
|
|
|
Png,
|
|
|
|
Gif,
|
|
|
|
Unknown,
|
|
|
|
}
|