diff --git a/Cargo.lock b/Cargo.lock index 89b6fec18..5a2206f0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3046,6 +3046,7 @@ dependencies = [ "rand", "regress", "ruffle_macros", + "ruffle_render", "ruffle_wstr", "serde", "serde_json", @@ -3097,6 +3098,15 @@ dependencies = [ "syn", ] +[[package]] +name = "ruffle_render" +version = "0.1.0" +dependencies = [ + "gc-arena", + "log", + "swf", +] + [[package]] name = "ruffle_render_canvas" version = "0.1.0" @@ -3105,6 +3115,7 @@ dependencies = [ "js-sys", "log", "ruffle_core", + "ruffle_render", "ruffle_web_common", "wasm-bindgen", "web-sys", @@ -3117,6 +3128,7 @@ dependencies = [ "log", "lyon", "ruffle_core", + "ruffle_render", ] [[package]] @@ -3128,6 +3140,7 @@ dependencies = [ "js-sys", "log", "ruffle_core", + "ruffle_render", "ruffle_render_common_tess", "ruffle_web_common", "wasm-bindgen", @@ -3147,6 +3160,7 @@ dependencies = [ "log", "raw-window-handle 0.4.3", "ruffle_core", + "ruffle_render", "ruffle_render_common_tess", "web-sys", "wgpu", diff --git a/Cargo.toml b/Cargo.toml index 0481f6bb9..ce54d7b6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ members = [ "scanner", "exporter", + "render", "render/canvas", "render/wgpu", "render/common_tess", diff --git a/core/Cargo.toml b/core/Cargo.toml index afa509313..8e7a6dc6b 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -17,6 +17,7 @@ indexmap = "1.9.1" log = "0.4" minimp3 = { version = "0.5.1", optional = true } png = { version = "0.17.5" } +ruffle_render = { path = "../render" } ruffle_macros = { path = "macros" } ruffle_wstr = { path = "../wstr" } swf = { path = "../swf" } diff --git a/core/src/avm1/globals/movie_clip.rs b/core/src/avm1/globals/movie_clip.rs index 170d17213..702bbf5ab 100644 --- a/core/src/avm1/globals/movie_clip.rs +++ b/core/src/avm1/globals/movie_clip.rs @@ -8,7 +8,7 @@ use crate::avm1::property_decl::{define_properties_on, Declaration}; use crate::avm1::{self, Object, ScriptObject, TObject, Value}; use crate::avm_error; use crate::avm_warn; -use crate::backend::{navigator::NavigationMethod, render}; +use crate::backend::navigator::NavigationMethod; use crate::display_object::{ Bitmap, DisplayObject, EditText, MovieClip, TDisplayObject, TDisplayObjectContainer, }; @@ -358,7 +358,7 @@ fn begin_bitmap_fill<'gc>( } else { return Ok(Value::Undefined); }; - let bitmap = render::BitmapInfo { + let bitmap = ruffle_render::bitmap::BitmapInfo { handle, width: bitmap_data.width() as u16, height: bitmap_data.height() as u16, diff --git a/core/src/backend/render.rs b/core/src/backend/render.rs index 931e7e501..9ef35237d 100644 --- a/core/src/backend/render.rs +++ b/core/src/backend/render.rs @@ -1,4 +1,3 @@ -mod bitmap; mod null; mod utils; @@ -7,9 +6,9 @@ pub use utils::{determine_jpeg_tag_format, remove_invalid_jpeg_data}; use crate::matrix::Matrix; use crate::shape_utils::DistilledShape; -pub use crate::{transform::Transform, Color}; -pub use bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapInfo, BitmapSource}; +pub use crate::transform::Transform; use downcast_rs::Downcast; +use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapInfo, BitmapSource}; pub use swf; pub trait RenderBackend: Downcast { @@ -79,10 +78,10 @@ pub trait RenderBackend: Downcast { }) } - fn begin_frame(&mut self, clear: Color); + fn begin_frame(&mut self, clear: swf::Color); fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, smoothing: bool); fn render_shape(&mut self, shape: ShapeHandle, transform: &Transform); - fn draw_rect(&mut self, color: Color, matrix: &Matrix); + fn draw_rect(&mut self, color: swf::Color, matrix: &Matrix); fn end_frame(&mut self); fn push_mask(&mut self); fn activate_mask(&mut self); diff --git a/core/src/backend/render/null.rs b/core/src/backend/render/null.rs index 03d725ff0..7f534cca0 100644 --- a/core/src/backend/render/null.rs +++ b/core/src/backend/render/null.rs @@ -1,8 +1,8 @@ -use crate::backend::render::bitmap::{Bitmap, BitmapHandle, BitmapInfo, BitmapSource}; use crate::backend::render::{Error, RenderBackend, ShapeHandle}; use crate::matrix::Matrix; use crate::shape_utils::DistilledShape; use crate::transform::Transform; +use ruffle_render::bitmap::{Bitmap, BitmapHandle, BitmapInfo, BitmapSource}; use swf::Color; pub struct NullBitmapSource; diff --git a/core/src/backend/video.rs b/core/src/backend/video.rs index 6a3817d68..a28215c1e 100644 --- a/core/src/backend/video.rs +++ b/core/src/backend/video.rs @@ -1,7 +1,8 @@ //! Video decoder backends -use crate::backend::render::{BitmapInfo, RenderBackend}; +use crate::backend::render::RenderBackend; use generational_arena::{Arena, Index}; +use ruffle_render::bitmap::BitmapInfo; use swf::{VideoCodec, VideoDeblocking}; mod software; diff --git a/core/src/backend/video/software/mod.rs b/core/src/backend/video/software/mod.rs index 225225011..156af1167 100644 --- a/core/src/backend/video/software/mod.rs +++ b/core/src/backend/video/software/mod.rs @@ -1,10 +1,11 @@ //! Pure software video decoding backend. -use crate::backend::render::{Bitmap, BitmapFormat, BitmapHandle, BitmapInfo, RenderBackend}; +use crate::backend::render::RenderBackend; use crate::backend::video::{ DecodedFrame, EncodedFrame, Error, FrameDependency, VideoBackend, VideoStreamHandle, }; use generational_arena::Arena; +use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapInfo}; use swf::{VideoCodec, VideoDeblocking}; mod decoders; diff --git a/core/src/bitmap/bitmap_data.rs b/core/src/bitmap/bitmap_data.rs index 05868d926..0122165e3 100644 --- a/core/src/bitmap/bitmap_data.rs +++ b/core/src/bitmap/bitmap_data.rs @@ -1,10 +1,11 @@ use gc_arena::Collect; use crate::avm2::{Object as Avm2Object, Value as Avm2Value}; -use crate::backend::render::{Bitmap, BitmapFormat, BitmapHandle, RenderBackend}; +use crate::backend::render::RenderBackend; use crate::bitmap::color_transform_params::ColorTransformParams; use crate::bitmap::turbulence::Turbulence; use bitflags::bitflags; +use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle}; use std::ops::Range; /// An implementation of the Lehmer/Park-Miller random number generator diff --git a/core/src/display_object/bitmap.rs b/core/src/display_object/bitmap.rs index 86a6a78ef..facd00336 100644 --- a/core/src/display_object/bitmap.rs +++ b/core/src/display_object/bitmap.rs @@ -5,12 +5,12 @@ use crate::avm2::{ Activation as Avm2Activation, ClassObject as Avm2ClassObject, Object as Avm2Object, StageObject as Avm2StageObject, Value as Avm2Value, }; -use crate::backend::render::BitmapHandle; use crate::context::{RenderContext, UpdateContext}; use crate::display_object::{DisplayObjectBase, DisplayObjectPtr, TDisplayObject}; use crate::prelude::*; use crate::vminterface::{AvmType, Instantiator}; use gc_arena::{Collect, Gc, GcCell, MutationContext}; +use ruffle_render::bitmap::BitmapHandle; use std::cell::{Ref, RefMut}; /// A Bitmap display object is a raw bitamp on the stage. diff --git a/core/src/display_object/video.rs b/core/src/display_object/video.rs index e2dafb34c..d3a4ea0ea 100644 --- a/core/src/display_object/video.rs +++ b/core/src/display_object/video.rs @@ -4,7 +4,6 @@ use crate::avm1::{Object as Avm1Object, StageObject as Avm1StageObject}; use crate::avm2::{ Activation as Avm2Activation, Object as Avm2Object, StageObject as Avm2StageObject, }; -use crate::backend::render::BitmapInfo; use crate::backend::video::{EncodedFrame, VideoStreamHandle}; use crate::bounding_box::BoundingBox; use crate::context::{RenderContext, UpdateContext}; @@ -13,6 +12,7 @@ use crate::prelude::*; use crate::tag_utils::{SwfMovie, SwfSlice}; use crate::vminterface::{AvmObject, AvmType, Instantiator}; use gc_arena::{Collect, GcCell, MutationContext}; +use ruffle_render::bitmap::BitmapInfo; use std::borrow::{Borrow, BorrowMut}; use std::cell::{Ref, RefMut}; use std::collections::{BTreeMap, BTreeSet}; diff --git a/core/src/drawing.rs b/core/src/drawing.rs index 7e64fed60..7f0cba52c 100644 --- a/core/src/drawing.rs +++ b/core/src/drawing.rs @@ -1,8 +1,9 @@ -use crate::backend::render::{BitmapInfo, BitmapSource, ShapeHandle}; +use crate::backend::render::ShapeHandle; use crate::bounding_box::BoundingBox; use crate::context::RenderContext; use crate::shape_utils::{DistilledShape, DrawCommand, DrawPath}; use gc_arena::Collect; +use ruffle_render::bitmap::{BitmapInfo, BitmapSource}; use std::cell::Cell; use swf::{FillStyle, LineStyle, Twips}; diff --git a/core/src/library.rs b/core/src/library.rs index 11f7b6394..23d7703a4 100644 --- a/core/src/library.rs +++ b/core/src/library.rs @@ -330,10 +330,10 @@ impl<'gc> MovieLibrary<'gc> { } } -impl<'gc> render::BitmapSource for MovieLibrary<'gc> { - fn bitmap(&self, id: u16) -> Option { +impl<'gc> ruffle_render::bitmap::BitmapSource for MovieLibrary<'gc> { + fn bitmap(&self, id: u16) -> Option { self.get_bitmap(id).and_then(|bitmap| { - Some(render::BitmapInfo { + Some(ruffle_render::bitmap::BitmapInfo { handle: bitmap.bitmap_handle()?, width: bitmap.width(), height: bitmap.height(), diff --git a/render/Cargo.toml b/render/Cargo.toml new file mode 100644 index 000000000..aa1dd0c42 --- /dev/null +++ b/render/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ruffle_render" +version = "0.1.0" +authors = ["Ruffle LLC "] +edition = "2021" +license = "MIT OR Apache-2.0" + +[dependencies] +swf = {path = "../swf"} +gc-arena = { git = "https://github.com/ruffle-rs/gc-arena" } +log = "0.4" + diff --git a/render/canvas/Cargo.toml b/render/canvas/Cargo.toml index 7150f43b2..19b5a76c1 100644 --- a/render/canvas/Cargo.toml +++ b/render/canvas/Cargo.toml @@ -11,6 +11,7 @@ log = "0.4" ruffle_web_common = { path = "../../web/common" } wasm-bindgen = "=0.2.82" fnv = "1.0.7" +ruffle_render = { path = ".." } [dependencies.ruffle_core] path = "../../core" diff --git a/render/canvas/src/lib.rs b/render/canvas/src/lib.rs index 8defc70a0..6e039f8cd 100644 --- a/render/canvas/src/lib.rs +++ b/render/canvas/src/lib.rs @@ -1,11 +1,10 @@ use fnv::FnvHashMap; -use ruffle_core::backend::render::{ - swf, Bitmap, BitmapFormat, BitmapHandle, BitmapSource, Color, NullBitmapSource, RenderBackend, - ShapeHandle, Transform, -}; +use ruffle_core::backend::render::{NullBitmapSource, RenderBackend, ShapeHandle, Transform}; use ruffle_core::color_transform::ColorTransform; use ruffle_core::matrix::Matrix; use ruffle_core::shape_utils::{DistilledShape, DrawCommand, LineScaleMode, LineScales}; +use ruffle_core::swf::{self, Color}; +use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapSource}; use ruffle_web_common::{JsError, JsResult}; use wasm_bindgen::{Clamped, JsCast}; use web_sys::{ diff --git a/render/common_tess/Cargo.toml b/render/common_tess/Cargo.toml index 753fe2107..8435e855e 100644 --- a/render/common_tess/Cargo.toml +++ b/render/common_tess/Cargo.toml @@ -8,6 +8,7 @@ license = "MIT OR Apache-2.0" [dependencies] log = "0.4" lyon = "1.0.0" +ruffle_render = { path = ".." } [dependencies.ruffle_core] path = "../../core" diff --git a/render/common_tess/src/lib.rs b/render/common_tess/src/lib.rs index 4f0dbbd6a..983d67947 100644 --- a/render/common_tess/src/lib.rs +++ b/render/common_tess/src/lib.rs @@ -5,8 +5,9 @@ use lyon::tessellation::{ FillTessellator, FillVertex, StrokeTessellator, StrokeVertex, StrokeVertexConstructor, }; use lyon::tessellation::{FillOptions, StrokeOptions}; -use ruffle_core::backend::render::{swf, BitmapHandle, BitmapSource}; use ruffle_core::shape_utils::{DistilledShape, DrawCommand, DrawPath}; +use ruffle_core::swf; +use ruffle_render::bitmap::{BitmapHandle, BitmapSource}; pub struct ShapeTessellator { fill_tess: FillTessellator, diff --git a/core/src/backend/render/bitmap.rs b/render/src/bitmap.rs similarity index 100% rename from core/src/backend/render/bitmap.rs rename to render/src/bitmap.rs diff --git a/render/src/lib.rs b/render/src/lib.rs new file mode 100644 index 000000000..163f8968d --- /dev/null +++ b/render/src/lib.rs @@ -0,0 +1 @@ +pub mod bitmap; diff --git a/render/webgl/Cargo.toml b/render/webgl/Cargo.toml index 2357dc95f..00a2e6678 100644 --- a/render/webgl/Cargo.toml +++ b/render/webgl/Cargo.toml @@ -10,6 +10,7 @@ js-sys = "0.3.59" log = "0.4" ruffle_render_common_tess = { path = "../common_tess" } ruffle_web_common = { path = "../../web/common" } +ruffle_render = { path = ".." } wasm-bindgen = "=0.2.82" bytemuck = { version = "1.10.0", features = ["derive"] } fnv = "1.0.7" diff --git a/render/webgl/src/lib.rs b/render/webgl/src/lib.rs index a5072f8df..65a929e1a 100644 --- a/render/webgl/src/lib.rs +++ b/render/webgl/src/lib.rs @@ -1,11 +1,9 @@ use bytemuck::{Pod, Zeroable}; use fnv::FnvHashMap; -use ruffle_core::backend::render::{ - Bitmap, BitmapFormat, BitmapHandle, BitmapSource, Color, NullBitmapSource, RenderBackend, - ShapeHandle, Transform, -}; +use ruffle_core::backend::render::{NullBitmapSource, RenderBackend, ShapeHandle, Transform}; use ruffle_core::shape_utils::DistilledShape; -use ruffle_core::swf; +use ruffle_core::swf::{self, Color}; +use ruffle_render::bitmap::{Bitmap, BitmapFormat, BitmapHandle, BitmapSource}; use ruffle_render_common_tess::{ Gradient as TessGradient, GradientType, ShapeTessellator, Vertex as TessVertex, }; diff --git a/render/wgpu/Cargo.toml b/render/wgpu/Cargo.toml index 5583d03e5..0c958f0ed 100644 --- a/render/wgpu/Cargo.toml +++ b/render/wgpu/Cargo.toml @@ -10,6 +10,7 @@ wgpu = "0.13.0" log = "0.4" ruffle_core = { path = "../../core", default-features = false } ruffle_render_common_tess = { path = "../common_tess" } +ruffle_render = { path = ".." } bytemuck = { version = "1.10.0", features = ["derive"] } raw-window-handle = "0.4" clap = { version = "3.2.16", features = ["derive"], optional = true } diff --git a/render/wgpu/src/lib.rs b/render/wgpu/src/lib.rs index b5595309a..411a73c2d 100644 --- a/render/wgpu/src/lib.rs +++ b/render/wgpu/src/lib.rs @@ -7,12 +7,11 @@ use crate::utils::{create_buffer_with_data, format_list, get_backend_names}; use bytemuck::{Pod, Zeroable}; use enum_map::Enum; use fnv::FnvHashMap; -use ruffle_core::backend::render::{ - Bitmap, BitmapHandle, BitmapSource, Color, RenderBackend, ShapeHandle, Transform, -}; +use ruffle_core::backend::render::{RenderBackend, ShapeHandle, Transform}; use ruffle_core::color_transform::ColorTransform; use ruffle_core::shape_utils::DistilledShape; -use ruffle_core::swf; +use ruffle_core::swf::{self, Color}; +use ruffle_render::bitmap::{Bitmap, BitmapHandle, BitmapSource}; use ruffle_render_common_tess::{ DrawType as TessDrawType, Gradient as TessGradient, GradientType, ShapeTessellator, Vertex as TessVertex,