summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-08-30 05:06:08 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-08-30 05:06:08 +0200
commit89acf0217e0acd92a82bff1fd516cd4266c0878a (patch)
tree7ed80675520b67c02e1a171a2131100281d7c5d7
parented3454301e663a7cb7d73cd56b57b188f4d14a2f (diff)
downloadiced-89acf0217e0acd92a82bff1fd516cd4266c0878a.tar.gz
iced-89acf0217e0acd92a82bff1fd516cd4266c0878a.tar.bz2
iced-89acf0217e0acd92a82bff1fd516cd4266c0878a.zip
Use `min_bounds` for cached text
-rw-r--r--graphics/src/text/cache.rs17
-rw-r--r--tiny_skia/src/text.rs8
-rw-r--r--wgpu/src/text.rs17
3 files changed, 27 insertions, 15 deletions
diff --git a/graphics/src/text/cache.rs b/graphics/src/text/cache.rs
index 8aea6715..9e4fbf65 100644
--- a/graphics/src/text/cache.rs
+++ b/graphics/src/text/cache.rs
@@ -8,7 +8,7 @@ use std::hash::{BuildHasher, Hash, Hasher};
#[allow(missing_debug_implementations)]
#[derive(Default)]
pub struct Cache {
- entries: FxHashMap<KeyHash, cosmic_text::Buffer>,
+ entries: FxHashMap<KeyHash, Entry>,
aliases: FxHashMap<KeyHash, KeyHash>,
recently_used: FxHashSet<KeyHash>,
hasher: HashBuilder,
@@ -25,7 +25,7 @@ impl Cache {
Self::default()
}
- pub fn get(&self, key: &KeyHash) -> Option<&cosmic_text::Buffer> {
+ pub fn get(&self, key: &KeyHash) -> Option<&Entry> {
self.entries.get(key)
}
@@ -33,7 +33,7 @@ impl Cache {
&mut self,
font_system: &mut cosmic_text::FontSystem,
key: Key<'_>,
- ) -> (KeyHash, &mut cosmic_text::Buffer) {
+ ) -> (KeyHash, &mut Entry) {
let hash = key.hash(self.hasher.build_hasher());
if let Some(hash) = self.aliases.get(&hash) {
@@ -59,7 +59,10 @@ impl Cache {
);
let bounds = text::measure(&buffer);
- let _ = entry.insert(buffer);
+ let _ = entry.insert(Entry {
+ buffer,
+ min_bounds: bounds,
+ });
for bounds in [
bounds,
@@ -118,3 +121,9 @@ impl Key<'_> {
}
pub type KeyHash = u64;
+
+#[allow(missing_debug_implementations)]
+pub struct Entry {
+ pub buffer: cosmic_text::Buffer,
+ pub min_bounds: Size,
+}
diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs
index e4c5ad9b..6047a826 100644
--- a/tiny_skia/src/text.rs
+++ b/tiny_skia/src/text.rs
@@ -77,10 +77,10 @@ impl Pipeline {
shaping,
};
- let (_, buffer) = self.cache.get_mut().allocate(font_system, key);
+ let (_, entry) = self.cache.get_mut().allocate(font_system, key);
- let max_width = bounds.width * scale_factor;
- let total_height = bounds.height * scale_factor;
+ let max_width = entry.min_bounds.width * scale_factor;
+ let total_height = entry.min_bounds.height * scale_factor;
let bounds = bounds * scale_factor;
@@ -98,7 +98,7 @@ impl Pipeline {
let mut swash = cosmic_text::SwashCache::new();
- for run in buffer.layout_runs() {
+ for run in entry.buffer.layout_runs() {
for glyph in run.glyphs {
let physical_glyph = glyph.physical((x, y), scale_factor);
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index da2062fe..ee352368 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -59,7 +59,7 @@ impl Pipeline {
device: &wgpu::Device,
queue: &wgpu::Queue,
sections: &[Text<'_>],
- bounds: Rectangle,
+ layer_bounds: Rectangle,
scale_factor: f32,
target_size: Size<u32>,
) {
@@ -98,8 +98,8 @@ impl Pipeline {
),
font: text.font,
bounds: Size {
- width: bounds.width,
- height: bounds.height,
+ width: text.bounds.width,
+ height: text.bounds.height,
},
shaping: text.shaping,
},
@@ -110,7 +110,7 @@ impl Pipeline {
})
.collect();
- let layer_bounds = bounds * scale_factor;
+ let layer_bounds = layer_bounds * scale_factor;
let text_areas = sections.iter().zip(allocations.iter()).filter_map(
|(section, allocation)| {
@@ -144,11 +144,14 @@ impl Pipeline {
return None;
};
- let buffer = cache.get(key).expect("Get cached buffer");
+ let entry = cache.get(key).expect("Get cached buffer");
(
- buffer,
- text.bounds,
+ &entry.buffer,
+ Rectangle::new(
+ text.bounds.position(),
+ entry.min_bounds,
+ ),
text.horizontal_alignment,
text.vertical_alignment,
text.color,