summaryrefslogtreecommitdiffstats
path: root/core/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-03-22 00:36:57 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-04-04 02:08:02 +0200
commit0f7abffc0e94b4bb9f8117db633bfd07d900eb93 (patch)
tree89b6606db2619574369bf8c4a29d5ef0ecb7969c /core/src
parent6fae8bf6cbe7155bcee42eaeba68e31564df057c (diff)
downloadiced-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.rs30
-rw-r--r--core/src/rectangle.rs34
-rw-r--r--core/src/svg.rs4
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),