diff --git a/crates/elements/src/definitions.rs b/crates/elements/src/definitions.rs index f2ac4c26d..594e8e643 100644 --- a/crates/elements/src/definitions.rs +++ b/crates/elements/src/definitions.rs @@ -424,7 +424,7 @@ builder_constructors! { /// static RUST_LOGO: &[u8] = include_bytes!("./rust_logo.png"); /// /// fn app() -> Element { - /// let image_data = bytes_to_data(RUST_LOGO); + /// let image_data = static_bytes_to_data(RUST_LOGO); /// rsx!( /// image { /// image_data: image_data, diff --git a/crates/freya/src/lib.rs b/crates/freya/src/lib.rs index 59eb681a6..b0822f735 100644 --- a/crates/freya/src/lib.rs +++ b/crates/freya/src/lib.rs @@ -110,7 +110,7 @@ pub mod prelude { pub use freya_elements::elements as dioxus_elements; pub use freya_elements::events::*; pub use freya_hooks::*; - pub use freya_node_state::{bytes_to_data, CustomAttributeValues}; + pub use freya_node_state::{bytes_to_data, static_bytes_to_data, CustomAttributeValues}; pub use freya_renderer::*; pub use torin::prelude::*; } diff --git a/crates/renderer/src/elements/image.rs b/crates/renderer/src/elements/image.rs index 7a8e9f14d..46722483d 100644 --- a/crates/renderer/src/elements/image.rs +++ b/crates/renderer/src/elements/image.rs @@ -30,6 +30,6 @@ pub fn render_image(area: &Area, node_ref: &DioxusNode, canvas: &Canvas) { draw_img(image_data) } } else if let Some(image_data) = &node_style.image_data { - draw_img(image_data) + draw_img(image_data.as_slice()) } } diff --git a/crates/renderer/src/elements/svg.rs b/crates/renderer/src/elements/svg.rs index 22e451172..d20627949 100644 --- a/crates/renderer/src/elements/svg.rs +++ b/crates/renderer/src/elements/svg.rs @@ -11,7 +11,7 @@ pub fn render_svg(area: &Area, node_ref: &DioxusNode, canvas: &Canvas) { let x = area.min_x(); let y = area.min_y(); if let Some(svg_data) = &node_style.svg_data { - let svg_dom = svg::Dom::from_bytes(svg_data); + let svg_dom = svg::Dom::from_bytes(svg_data.as_slice()); if let Ok(mut svg_dom) = svg_dom { canvas.save(); canvas.translate((x, y)); diff --git a/crates/state/src/custom_attributes.rs b/crates/state/src/custom_attributes.rs index cccdcfbed..ab7d19b0e 100644 --- a/crates/state/src/custom_attributes.rs +++ b/crates/state/src/custom_attributes.rs @@ -104,12 +104,27 @@ impl Display for CursorReference { } } +#[derive(Debug, Clone, PartialEq)] +pub enum AttributesBytes { + Dynamic(Arc>), + Static(&'static [u8]), +} + +impl AttributesBytes { + pub fn as_slice(&self) -> &[u8] { + match self { + Self::Dynamic(bytes) => bytes.as_slice(), + Self::Static(bytes) => bytes, + } + } +} + /// Group all the custom attribute types #[derive(Clone, PartialEq)] pub enum CustomAttributeValues { Reference(NodeReference), CursorReference(CursorReference), - Bytes(Vec), + Bytes(AttributesBytes), ImageReference(ImageReference), AccessibilityId(AccessibilityId), TextHighlights(Vec<(usize, usize)>), @@ -138,5 +153,12 @@ impl FromAnyValue for CustomAttributeValues { /// Transform some bytes (e.g: raw image, raw svg) into attribute data pub fn bytes_to_data(bytes: &[u8]) -> AttributeValue { - AttributeValue::any_value(CustomAttributeValues::Bytes(bytes.to_vec())) + AttributeValue::any_value(CustomAttributeValues::Bytes(AttributesBytes::Dynamic( + Arc::new(bytes.to_vec()), + ))) +} + +/// Transform some static bytes (e.g: raw image, raw svg) into attribute data +pub fn static_bytes_to_data(bytes: &'static [u8]) -> AttributeValue { + AttributeValue::any_value(CustomAttributeValues::Bytes(AttributesBytes::Static(bytes))) } diff --git a/crates/state/src/style.rs b/crates/state/src/style.rs index 87c45b430..d1dd7d3ab 100644 --- a/crates/state/src/style.rs +++ b/crates/state/src/style.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use dioxus_native_core::{ exports::shipyard::Component, node::OwnedAttributeValue, @@ -9,8 +11,8 @@ use dioxus_native_core_macro::partial_derive_state; use torin::scaled::Scaled; use crate::{ - parsing::ExtSplit, Border, BorderAlignment, CornerRadius, CustomAttributeValues, Fill, - OverflowMode, Parse, Shadow, + parsing::ExtSplit, AttributesBytes, Border, BorderAlignment, CornerRadius, + CustomAttributeValues, Fill, OverflowMode, Parse, Shadow, }; #[derive(Default, Debug, Clone, PartialEq, Component)] @@ -20,8 +22,8 @@ pub struct Style { pub border: Border, pub shadows: Vec, pub corner_radius: CornerRadius, - pub image_data: Option>, - pub svg_data: Option>, + pub image_data: Option, + pub svg_data: Option, pub overflow: OverflowMode, pub opacity: Option, } @@ -142,7 +144,8 @@ impl State for Style { } "svg_content" => { let text = attr.value.as_text(); - style.svg_data = text.map(|v| v.as_bytes().to_owned()); + style.svg_data = text + .map(|v| AttributesBytes::Dynamic(Arc::new(v.as_bytes().to_owned()))); } "overflow" => { if let Some(value) = attr.value.as_text() { diff --git a/examples/image.rs b/examples/image.rs index bc640853b..33afb7e01 100644 --- a/examples/image.rs +++ b/examples/image.rs @@ -12,7 +12,7 @@ fn main() { static RUST_LOGO: &[u8] = include_bytes!("./rust_logo.png"); fn app() -> Element { - let image_data = bytes_to_data(RUST_LOGO); + let image_data = static_bytes_to_data(RUST_LOGO); let mut size = use_signal(|| 250); let onwheel = move |e: WheelEvent| { diff --git a/examples/opacity.rs b/examples/opacity.rs index 239cc876f..3ca9bbcc2 100644 --- a/examples/opacity.rs +++ b/examples/opacity.rs @@ -12,7 +12,7 @@ fn main() { } fn app() -> Element { - let ferris = bytes_to_data(FERRIS); + let ferris = static_bytes_to_data(FERRIS); let mut opacity = use_signal(|| 70.0); rsx!( diff --git a/examples/svg.rs b/examples/svg.rs index 4f874ada1..c016c0871 100644 --- a/examples/svg.rs +++ b/examples/svg.rs @@ -12,7 +12,7 @@ fn main() { static FERRIS: &[u8] = include_bytes!("./ferris.svg"); fn app() -> Element { - let ferris_a = bytes_to_data(FERRIS); + let ferris_a = static_bytes_to_data(FERRIS); let ferris_b = bytes_to_data(FERRIS); rsx!( svg {