fix font loading for 3+ byte codepoints
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
use std::{rc::Rc, str::FromStr, sync::Arc};
|
use std::{rc::Rc, str::FromStr, sync::Arc};
|
||||||
|
|
||||||
use fontconfig::{FontConfig, OwnedPattern};
|
use fontconfig::{FontConfig, OwnedPattern};
|
||||||
use freetype::{bitmap::PixelMode, face::LoadFlag, Face, Library};
|
use freetype::{
|
||||||
|
bitmap::PixelMode,
|
||||||
|
face::{CharIterator, LoadFlag},
|
||||||
|
Face, Library,
|
||||||
|
};
|
||||||
use idmap::IdMap;
|
use idmap::IdMap;
|
||||||
use vulkano::{command_buffer::CommandBufferUsage, format::Format, image::Image};
|
use vulkano::{command_buffer::CommandBufferUsage, format::Format, image::Image};
|
||||||
|
|
||||||
@@ -124,11 +128,8 @@ impl FontCache {
|
|||||||
let pattern = pattern.font_match(&mut self.fc);
|
let pattern = pattern.font_match(&mut self.fc);
|
||||||
|
|
||||||
if let Some(path) = pattern.filename() {
|
if let Some(path) = pattern.filename() {
|
||||||
log::debug!(
|
let name = pattern.name().unwrap_or(path);
|
||||||
"Loading font: {} {}pt",
|
log::debug!("Loading font: {} {}pt", name, size);
|
||||||
pattern.name().unwrap_or(path),
|
|
||||||
size
|
|
||||||
);
|
|
||||||
|
|
||||||
let font_idx = pattern.face_index().unwrap_or(0);
|
let font_idx = pattern.face_index().unwrap_or(0);
|
||||||
|
|
||||||
@@ -150,14 +151,16 @@ impl FontCache {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let idx = coll.fonts.len();
|
let idx = coll.fonts.len();
|
||||||
for cp in 0..0xFFFF {
|
for (cp, _) in face.chars() {
|
||||||
if coll.cp_map.contains_key(cp) {
|
if coll.cp_map.contains_key(cp) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let g = face.get_char_index(cp);
|
coll.cp_map.insert(cp, idx);
|
||||||
if g.is_some() {
|
}
|
||||||
coll.cp_map.insert(cp, idx);
|
|
||||||
}
|
if !coll.cp_map.contains_key(cp) {
|
||||||
|
log::warn!("Got font '{name}' for CP 0x{cp:x}, but CP is not present in font!",);
|
||||||
|
coll.cp_map.insert(cp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
let zero_glyph = Rc::new(Glyph {
|
let zero_glyph = Rc::new(Glyph {
|
||||||
@@ -189,7 +192,7 @@ impl FontCache {
|
|||||||
let key = self.get_font_for_cp(cp, size);
|
let key = self.get_font_for_cp(cp, size);
|
||||||
|
|
||||||
let Some(font) = &mut self.collections[size].fonts.get_mut(key) else {
|
let Some(font) = &mut self.collections[size].fonts.get_mut(key) else {
|
||||||
log::warn!("No font found for codepoint: {}", cp);
|
log::warn!("No font found for codepoint: 0x{cp:x}");
|
||||||
return Ok(self.collections[size].zero_glyph.clone());
|
return Ok(self.collections[size].zero_glyph.clone());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user