summaryrefslogtreecommitdiffstats
path: root/core/src/text.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-09-09 11:21:32 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-09-09 11:21:32 +0200
commit3450987355be7fe029db112474d06613929b54c7 (patch)
tree1d2186d822add1becdd5c942cc6a6c67e5437b57 /core/src/text.rs
parent837529bc995a728300c61fc102474cc31f7a6500 (diff)
downloadiced-3450987355be7fe029db112474d06613929b54c7.tar.gz
iced-3450987355be7fe029db112474d06613929b54c7.tar.bz2
iced-3450987355be7fe029db112474d06613929b54c7.zip
Invalidate existing paragraphs when new fonts are loaded
Diffstat (limited to 'core/src/text.rs')
-rw-r--r--core/src/text.rs68
1 files changed, 56 insertions, 12 deletions
diff --git a/core/src/text.rs b/core/src/text.rs
index c59c683a..f5e9abc4 100644
--- a/core/src/text.rs
+++ b/core/src/text.rs
@@ -172,18 +172,14 @@ pub trait Renderer: crate::Renderer {
paragraph: &mut Self::Paragraph,
text: Text<'_, Self::Font>,
) {
- if paragraph.content() != text.content
- || paragraph.text_size() != text.size
- || paragraph.line_height().to_absolute(text.size)
- != text.line_height.to_absolute(text.size)
- || paragraph.font() != text.font
- || paragraph.shaping() != text.shaping
- || paragraph.horizontal_alignment() != text.horizontal_alignment
- || paragraph.vertical_alignment() != text.vertical_alignment
- {
- *paragraph = self.create_paragraph(text);
- } else if paragraph.bounds() != text.bounds {
- self.resize_paragraph(paragraph, text.bounds);
+ match compare(paragraph, text) {
+ Difference::None => {}
+ Difference::Bounds => {
+ self.resize_paragraph(paragraph, text.bounds);
+ }
+ Difference::Shape => {
+ *paragraph = self.create_paragraph(text);
+ }
}
}
@@ -255,3 +251,51 @@ pub trait Paragraph: Default {
self.min_bounds().height
}
}
+
+/// The difference detected in some text.
+///
+/// You will obtain a [`Difference`] when you [`compare`] a [`Paragraph`] with some
+/// [`Text`].
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum Difference {
+ /// No difference.
+ ///
+ /// The text can be reused as it is!
+ None,
+
+ /// A bounds difference.
+ ///
+ /// This normally means a relayout is necessary, but the shape of the text can
+ /// be reused.
+ Bounds,
+
+ /// A shape difference.
+ ///
+ /// The contents, alignment, sizes, fonts, or any other essential attributes
+ /// of the shape of the text have changed. A complete reshape and relayout of
+ /// the text is necessary.
+ Shape,
+}
+
+/// Compares a [`Paragraph`] with some desired [`Text`] and returns the
+/// [`Difference`].
+pub fn compare<Font: PartialEq>(
+ paragraph: &impl Paragraph<Font = Font>,
+ text: Text<'_, Font>,
+) -> Difference {
+ if paragraph.content() != text.content
+ || paragraph.text_size() != text.size
+ || paragraph.line_height().to_absolute(text.size)
+ != text.line_height.to_absolute(text.size)
+ || paragraph.font() != text.font
+ || paragraph.shaping() != text.shaping
+ || paragraph.horizontal_alignment() != text.horizontal_alignment
+ || paragraph.vertical_alignment() != text.vertical_alignment
+ {
+ Difference::Shape
+ } else if paragraph.bounds() != text.bounds {
+ Difference::Bounds
+ } else {
+ Difference::None
+ }
+}