wip
This commit is contained in:
parent
4d00d07df1
commit
f20341d188
5 changed files with 46 additions and 0 deletions
|
@ -447,6 +447,14 @@ impl App {
|
||||||
self.pending_effects.push_back(Effect::RefreshWindows);
|
self.pending_effects.push_back(Effect::RefreshWindows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clears cache of rasterized glyphs.
|
||||||
|
pub fn clear_glyph_atlases(&mut self) {
|
||||||
|
if let Some(window) = self.windows.values().find_map(|window| window.as_ref()) {
|
||||||
|
let atlas = window.platform_window.sprite_atlas();
|
||||||
|
atlas.clear_glyphs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn update<R>(&mut self, update: impl FnOnce(&mut Self) -> R) -> R {
|
pub(crate) fn update<R>(&mut self, update: impl FnOnce(&mut Self) -> R) -> R {
|
||||||
self.start_update();
|
self.start_update();
|
||||||
let result = update(self);
|
let result = update(self);
|
||||||
|
|
|
@ -743,6 +743,7 @@ pub(crate) trait PlatformAtlas: Send + Sync {
|
||||||
build: &mut dyn FnMut() -> Result<Option<(Size<DevicePixels>, Cow<'a, [u8]>)>>,
|
build: &mut dyn FnMut() -> Result<Option<(Size<DevicePixels>, Cow<'a, [u8]>)>>,
|
||||||
) -> Result<Option<AtlasTile>>;
|
) -> Result<Option<AtlasTile>>;
|
||||||
fn remove(&self, key: &AtlasKey);
|
fn remove(&self, key: &AtlasKey);
|
||||||
|
fn clear_glyphs(&self);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AtlasTextureList<T> {
|
struct AtlasTextureList<T> {
|
||||||
|
|
|
@ -57,6 +57,35 @@ impl PlatformAtlas for MetalAtlas {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn clear_glyphs(&self) {
|
||||||
|
let mut lock = self.0.lock();
|
||||||
|
let mut tile_ids_by_texture = FxHashMap::default();
|
||||||
|
lock.tiles_by_key.retain(|key, tile| {
|
||||||
|
if matches!(key, AtlasKey::Glyph(_)) {
|
||||||
|
tile_ids_by_texture
|
||||||
|
.entry(tile.texture_id)
|
||||||
|
.or_insert_with(Vec::new)
|
||||||
|
.push(tile.tile_id);
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (texture_id, tile_ids) in tile_ids_by_texture {
|
||||||
|
let texture_slot = &mut lock.monochrome_textures.textures[texture_id.index as usize];
|
||||||
|
if let Some(texture) = texture_slot {
|
||||||
|
texture.live_atlas_keys -= tile_ids.len() as u32;
|
||||||
|
if texture.is_unreferenced() {
|
||||||
|
texture_slot.take();
|
||||||
|
lock.monochrome_textures
|
||||||
|
.free_list
|
||||||
|
.push(texture_id.index as usize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn remove(&self, key: &AtlasKey) {
|
fn remove(&self, key: &AtlasKey) {
|
||||||
let mut lock = self.0.lock();
|
let mut lock = self.0.lock();
|
||||||
let Some(id) = lock.tiles_by_key.get(key).map(|v| v.texture_id) else {
|
let Some(id) = lock.tiles_by_key.get(key).map(|v| v.texture_id) else {
|
||||||
|
|
|
@ -359,4 +359,11 @@ impl PlatformAtlas for TestAtlas {
|
||||||
let mut state = self.0.lock();
|
let mut state = self.0.lock();
|
||||||
state.tiles.remove(key);
|
state.tiles.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn clear_glyphs(&self) {
|
||||||
|
let mut state = self.0.lock();
|
||||||
|
state
|
||||||
|
.tiles
|
||||||
|
.retain(|key, _| !matches!(key, AtlasKey::Glyph(_)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -722,6 +722,7 @@ pub fn adjust_buffer_font_size(cx: &mut App, mut f: impl FnMut(&mut Pixels)) {
|
||||||
|
|
||||||
f(&mut adjusted_size);
|
f(&mut adjusted_size);
|
||||||
cx.set_global(BufferFontSize(clamp_font_size(adjusted_size)));
|
cx.set_global(BufferFontSize(clamp_font_size(adjusted_size)));
|
||||||
|
cx.clear_glyph_atlases();
|
||||||
cx.refresh_windows();
|
cx.refresh_windows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue