summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-06-29 18:23:11 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-06-29 18:23:11 +0200
commitd666e739cdcc2084c14593888867d40066c232fe (patch)
tree68701bfd0d06f022887a0125a9c791572dce7e67
parentcdce03cf7f520ef0227aaec4eaed19332197f53b (diff)
downloadiced-d666e739cdcc2084c14593888867d40066c232fe.tar.gz
iced-d666e739cdcc2084c14593888867d40066c232fe.tar.bz2
iced-d666e739cdcc2084c14593888867d40066c232fe.zip
Trim text measurements only before `layout`
-rw-r--r--graphics/src/backend.rs7
-rw-r--r--graphics/src/renderer.rs2
-rw-r--r--wgpu/src/backend.rs4
-rw-r--r--wgpu/src/text.rs45
4 files changed, 30 insertions, 28 deletions
diff --git a/graphics/src/backend.rs b/graphics/src/backend.rs
index 77bb650b..59e95bf8 100644
--- a/graphics/src/backend.rs
+++ b/graphics/src/backend.rs
@@ -12,6 +12,13 @@ use std::borrow::Cow;
pub trait Backend {
/// The custom kind of primitives this [`Backend`] supports.
type Primitive;
+
+ /// Trims the measurements cache.
+ ///
+ /// This method is currently necessary to properly trim the text cache in
+ /// `iced_wgpu` and `iced_glow` because of limitations in the text rendering
+ /// pipeline. It will be removed in the future.
+ fn trim_measurements(&mut self) {}
}
/// A graphics backend that supports text rendering.
diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs
index 476aa407..c0cec60a 100644
--- a/graphics/src/renderer.rs
+++ b/graphics/src/renderer.rs
@@ -93,6 +93,8 @@ impl<B: Backend, T> iced_core::Renderer for Renderer<B, T> {
element: &Element<'_, Message, Self>,
limits: &layout::Limits,
) -> layout::Node {
+ self.backend.trim_measurements();
+
element.as_widget().layout(self, limits)
}
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs
index 596d43c5..4a0c54f0 100644
--- a/wgpu/src/backend.rs
+++ b/wgpu/src/backend.rs
@@ -337,6 +337,10 @@ impl Backend {
impl crate::graphics::Backend for Backend {
type Primitive = primitive::Custom;
+
+ fn trim_measurements(&mut self) {
+ self.text_pipeline.trim_measurements();
+ }
}
impl backend::Text for Backend {
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index c87b94a8..65d3b818 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -81,8 +81,7 @@ impl Pipeline {
let cache = self.cache.get_mut();
if self.prepare_layer == 0 {
- let _ = cache.switch(Mode::Drawing);
- cache.trim();
+ cache.trim(Purpose::Drawing);
}
let keys: Vec<_> = sections
@@ -105,6 +104,7 @@ impl Pipeline {
},
shaping: section.shaping,
},
+ Purpose::Drawing,
);
key
@@ -233,6 +233,10 @@ impl Pipeline {
self.prepare_layer = 0;
}
+ pub fn trim_measurements(&mut self) {
+ self.cache.get_mut().trim(Purpose::Measuring);
+ }
+
pub fn measure(
&self,
content: &str,
@@ -246,10 +250,6 @@ impl Pipeline {
let line_height = f32::from(line_height.to_absolute(Pixels(size)));
- if cache.switch(Mode::Measuring) {
- cache.trim();
- }
-
let (_, entry) = cache.allocate(
&mut self.font_system.borrow_mut(),
Key {
@@ -260,6 +260,7 @@ impl Pipeline {
bounds,
shaping,
},
+ Purpose::Measuring,
);
entry.bounds
@@ -280,10 +281,6 @@ impl Pipeline {
let line_height = f32::from(line_height.to_absolute(Pixels(size)));
- if cache.switch(Mode::Measuring) {
- cache.trim();
- }
-
let (_, entry) = cache.allocate(
&mut self.font_system.borrow_mut(),
Key {
@@ -294,6 +291,7 @@ impl Pipeline {
bounds,
shaping,
},
+ Purpose::Measuring,
);
let cursor = entry.buffer.hit(point.x, point.y)?;
@@ -364,7 +362,6 @@ struct Cache {
recently_measured: FxHashSet<KeyHash>,
recently_drawn: FxHashSet<KeyHash>,
hasher: HashBuilder,
- mode: Mode,
}
struct Entry {
@@ -373,7 +370,7 @@ struct Entry {
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-enum Mode {
+enum Purpose {
Measuring,
Drawing,
}
@@ -392,7 +389,6 @@ impl Cache {
recently_measured: FxHashSet::default(),
recently_drawn: FxHashSet::default(),
hasher: HashBuilder::default(),
- mode: Mode::Measuring,
}
}
@@ -400,24 +396,17 @@ impl Cache {
self.entries.get(key)
}
- fn switch(&mut self, mode: Mode) -> bool {
- let has_changed = self.mode != mode;
-
- self.mode = mode;
-
- has_changed
- }
-
fn allocate(
&mut self,
font_system: &mut glyphon::FontSystem,
key: Key<'_>,
+ purpose: Purpose,
) -> (KeyHash, &mut Entry) {
let hash = key.hash(self.hasher.build_hasher());
- let recently_used = match self.mode {
- Mode::Measuring => &mut self.recently_measured,
- Mode::Drawing => &mut self.recently_drawn,
+ let recently_used = match purpose {
+ Purpose::Measuring => &mut self.recently_measured,
+ Purpose::Drawing => &mut self.recently_drawn,
};
if let Some(hash) = self.aliases.get(&hash) {
@@ -469,7 +458,7 @@ impl Cache {
(hash, self.entries.get_mut(&hash).unwrap())
}
- fn trim(&mut self) {
+ fn trim(&mut self, purpose: Purpose) {
self.entries.retain(|key, _| {
self.recently_measured.contains(key)
|| self.recently_drawn.contains(key)
@@ -479,11 +468,11 @@ impl Cache {
|| self.recently_drawn.contains(value)
});
- match self.mode {
- Mode::Measuring => {
+ match purpose {
+ Purpose::Measuring => {
self.recently_measured.clear();
}
- Mode::Drawing => {
+ Purpose::Drawing => {
self.recently_drawn.clear();
}
}