From 49224f8008dfcbc6e37c1ffe14ff0ade4887e0ec Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Sun, 23 Jan 2022 17:28:27 -0800 Subject: [PATCH] adjust font cache size if it gets too big --- src/renderer/fonts/caching_shaper.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/renderer/fonts/caching_shaper.rs b/src/renderer/fonts/caching_shaper.rs index 9451839..b46d454 100644 --- a/src/renderer/fonts/caching_shaper.rs +++ b/src/renderer/fonts/caching_shaper.rs @@ -1,8 +1,16 @@ use std::sync::Arc; -use log::trace; +use log::{trace, warn}; use lru::LruCache; -use skia_safe::{TextBlob, TextBlobBuilder}; +use skia_safe::{ + graphics::{ + font_cache_used, + font_cache_limit, + set_font_cache_limit, + }, + TextBlob, + TextBlobBuilder, +}; use swash::{ shape::ShapeContext, text::{ @@ -267,6 +275,18 @@ impl CachingShaper { grouped_results } + pub fn adjust_font_cache_size(&self) { + let current_font_cache_size = font_cache_limit() as f32; + let percent_font_cache_used = font_cache_used() as f32 / current_font_cache_size; + if percent_font_cache_used > 0.9 { + warn!( + "Font cache is {}% full, increasing cache size", + percent_font_cache_used * 100.0 + ); + set_font_cache_limit((percent_font_cache_used * 1.5) as usize); + } + } + pub fn shape(&mut self, text: String, bold: bool, italic: bool) -> Vec { let current_size = self.current_size(); let (glyph_width, ..) = self.font_base_dimensions(); @@ -313,6 +333,8 @@ impl CachingShaper { resulting_blobs.push(blob.expect("Could not create textblob")); } + self.adjust_font_cache_size(); + resulting_blobs }