Skip to content

Commit

Permalink
Use min_bounds for cached text
Browse files Browse the repository at this point in the history
  • Loading branch information
hecrj committed Aug 30, 2023
1 parent ed34543 commit 89acf02
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 15 deletions.
17 changes: 13 additions & 4 deletions graphics/src/text/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -25,15 +25,15 @@ 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)
}

pub fn allocate(
&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) {
Expand All @@ -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,
Expand Down Expand Up @@ -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,
}
8 changes: 4 additions & 4 deletions tiny_skia/src/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);

Expand Down
17 changes: 10 additions & 7 deletions wgpu/src/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
) {
Expand Down Expand Up @@ -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,
},
Expand All @@ -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)| {
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 89acf02

Please sign in to comment.