diff options
author | 2023-03-22 00:36:57 +0100 | |
---|---|---|
committer | 2023-04-04 02:08:02 +0200 | |
commit | 0f7abffc0e94b4bb9f8117db633bfd07d900eb93 (patch) | |
tree | 89b6606db2619574369bf8c4a29d5ef0ecb7969c /core/src | |
parent | 6fae8bf6cbe7155bcee42eaeba68e31564df057c (diff) | |
download | iced-0f7abffc0e94b4bb9f8117db633bfd07d900eb93.tar.gz iced-0f7abffc0e94b4bb9f8117db633bfd07d900eb93.tar.bz2 iced-0f7abffc0e94b4bb9f8117db633bfd07d900eb93.zip |
Draft (very) basic incremental rendering for `iced_tiny_skia`
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/image.rs | 30 | ||||
-rw-r--r-- | core/src/rectangle.rs | 34 | ||||
-rw-r--r-- | core/src/svg.rs | 4 |
3 files changed, 65 insertions, 3 deletions
diff --git a/core/src/image.rs b/core/src/image.rs index 70fbade0..618235ef 100644 --- a/core/src/image.rs +++ b/core/src/image.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; use std::sync::Arc; /// A handle of some image data. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Handle { id: u64, data: Data, @@ -156,6 +156,34 @@ impl std::fmt::Debug for Data { } } +impl PartialEq for Data { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Path(a), Self::Path(b)) => a == b, + (Self::Bytes(a), Self::Bytes(b)) => a.as_ref() == b.as_ref(), + ( + Self::Rgba { + width: width_a, + height: height_a, + pixels: pixels_a, + }, + Self::Rgba { + width: width_b, + height: height_b, + pixels: pixels_b, + }, + ) => { + width_a == width_b + && height_a == height_b + && pixels_a.as_ref() == pixels_b.as_ref() + } + _ => false, + } + } +} + +impl Eq for Data {} + /// A [`Renderer`] that can render raster graphics. /// /// [renderer]: crate::renderer diff --git a/core/src/rectangle.rs b/core/src/rectangle.rs index 4fe91519..5cdcbe78 100644 --- a/core/src/rectangle.rs +++ b/core/src/rectangle.rs @@ -100,6 +100,30 @@ impl Rectangle<f32> { } } + /// Returns whether the [`Rectangle`] intersects with the given one. + pub fn intersects(&self, other: &Self) -> bool { + self.intersection(other).is_some() + } + + /// Computes the union with the given [`Rectangle`]. + pub fn union(&self, other: &Self) -> Self { + let x = self.x.min(other.x); + let y = self.y.min(other.y); + + let lower_right_x = (self.x + self.width).max(other.x + other.width); + let lower_right_y = (self.y + self.height).max(other.y + other.height); + + let width = lower_right_x - x; + let height = lower_right_y - y; + + Rectangle { + x, + y, + width, + height, + } + } + /// Snaps the [`Rectangle`] to __unsigned__ integer coordinates. pub fn snap(self) -> Rectangle<u32> { Rectangle { @@ -109,6 +133,16 @@ impl Rectangle<f32> { height: self.height as u32, } } + + /// Expands the [`Rectangle`] a given amount. + pub fn expand(self, amount: f32) -> Self { + Self { + x: self.x - amount, + y: self.y - amount, + width: self.width + amount * 2.0, + height: self.height + amount * 2.0, + } + } } impl std::ops::Mul<f32> for Rectangle<f32> { diff --git a/core/src/svg.rs b/core/src/svg.rs index 9b98877a..54e9434e 100644 --- a/core/src/svg.rs +++ b/core/src/svg.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use std::sync::Arc; /// A handle of Svg data. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Handle { id: u64, data: Arc<Data>, @@ -57,7 +57,7 @@ impl Hash for Handle { } /// The data of a vectorial image. -#[derive(Clone, Hash)] +#[derive(Clone, Hash, PartialEq, Eq)] pub enum Data { /// File data Path(PathBuf), |