From 7b1934dcb6e731b91ad0cec40d6f96fe9b2fb90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 10 Dec 2024 15:41:50 +0100 Subject: [PATCH] :recycle: Create an ImageStore type --- render-wasm/src/render.rs | 25 ++++++-------- render-wasm/src/render/images.rs | 33 +++++++++++++++++++ render-wasm/src/shapes.rs | 2 +- .../src/shapes/{render.rs => renderable.rs} | 14 +++----- 4 files changed, 48 insertions(+), 26 deletions(-) create mode 100644 render-wasm/src/render/images.rs rename render-wasm/src/shapes/{render.rs => renderable.rs} (87%) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 9c8c2ebad..e3a34b983 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -1,26 +1,25 @@ +use std::collections::HashMap; + use skia::Contains; use skia_safe as skia; -use std::collections::HashMap; use uuid::Uuid; -use crate::shapes::{Image, Shape}; +use crate::shapes::Shape; use crate::view::Viewbox; mod blend; mod gpu_state; +mod images; mod options; use gpu_state::GpuState; use options::RenderOptions; pub use blend::BlendMode; +pub use images::*; pub trait Renderable { - fn render( - &self, - surface: &mut skia::Surface, - images: &HashMap, - ) -> Result<(), String>; + fn render(&self, surface: &mut skia::Surface, images: &ImageStore) -> Result<(), String>; fn blend_mode(&self) -> BlendMode; fn opacity(&self) -> f32; } @@ -45,7 +44,7 @@ pub(crate) struct RenderState { pub cached_surface_image: Option, options: RenderOptions, pub viewbox: Viewbox, - images: HashMap, + images: ImageStore, } impl RenderState { @@ -68,20 +67,16 @@ impl RenderState { cached_surface_image: None, options: RenderOptions::default(), viewbox: Viewbox::new(width as f32, height as f32), - images: HashMap::with_capacity(2048), + images: ImageStore::new(), } } pub fn add_image(&mut self, id: Uuid, image_data: &[u8]) -> Result<(), String> { - let image_data = skia::Data::new_copy(image_data); - let image = Image::from_encoded(image_data).ok_or("Error decoding image data")?; - - self.images.insert(id, image); - Ok(()) + self.images.add(id, image_data) } pub fn has_image(&mut self, id: &Uuid) -> bool { - self.images.contains_key(id) + self.images.contains(id) } pub fn set_debug_flags(&mut self, debug: u32) { diff --git a/render-wasm/src/render/images.rs b/render-wasm/src/render/images.rs new file mode 100644 index 000000000..a1d9f5fe7 --- /dev/null +++ b/render-wasm/src/render/images.rs @@ -0,0 +1,33 @@ +use skia_safe as skia; +use std::collections::HashMap; +use uuid::Uuid; + +pub type Image = skia::Image; + +pub struct ImageStore { + images: HashMap, +} + +impl ImageStore { + pub fn new() -> Self { + Self { + images: HashMap::with_capacity(2048), + } + } + + pub fn add(&mut self, id: Uuid, image_data: &[u8]) -> Result<(), String> { + let image_data = skia::Data::new_copy(image_data); + let image = Image::from_encoded(image_data).ok_or("Error decoding image data")?; + + self.images.insert(id, image); + Ok(()) + } + + pub fn contains(&mut self, id: &Uuid) -> bool { + self.images.contains_key(id) + } + + pub fn get(&self, id: &Uuid) -> Option<&Image> { + self.images.get(id) + } +} diff --git a/render-wasm/src/shapes.rs b/render-wasm/src/shapes.rs index 71b573d9f..82120ac92 100644 --- a/render-wasm/src/shapes.rs +++ b/render-wasm/src/shapes.rs @@ -7,7 +7,7 @@ use crate::render::BlendMode; mod fills; mod images; mod paths; -mod render; +mod renderable; pub use fills::*; pub use images::*; pub use paths::*; diff --git a/render-wasm/src/shapes/render.rs b/render-wasm/src/shapes/renderable.rs similarity index 87% rename from render-wasm/src/shapes/render.rs rename to render-wasm/src/shapes/renderable.rs index 1a4fa74db..718dc2e63 100644 --- a/render-wasm/src/shapes/render.rs +++ b/render-wasm/src/shapes/renderable.rs @@ -1,10 +1,8 @@ use skia_safe as skia; -use std::collections::HashMap; -use uuid::Uuid; -use super::{draw_image_in_container, Fill, Image, Kind, Shape}; +use super::{draw_image_in_container, Fill, Kind, Shape}; use crate::math::Rect; -use crate::render::Renderable; +use crate::render::{ImageStore, Renderable}; impl Renderable for Shape { fn blend_mode(&self) -> crate::render::BlendMode { @@ -15,11 +13,7 @@ impl Renderable for Shape { self.opacity } - fn render( - &self, - surface: &mut skia_safe::Surface, - images: &HashMap, - ) -> Result<(), String> { + fn render(&self, surface: &mut skia_safe::Surface, images: &ImageStore) -> Result<(), String> { let mut transform = skia::Matrix::new_identity(); let (translate_x, translate_y) = self.translation(); let (scale_x, scale_y) = self.scale(); @@ -59,7 +53,7 @@ impl Renderable for Shape { fn render_fill( surface: &mut skia::Surface, - images: &HashMap, + images: &ImageStore, fill: &Fill, selrect: Rect, kind: &Kind,