cosmic-text/src/font/system/no_std.rs

74 lines
1.6 KiB
Rust
Raw Normal View History

2022-11-08 08:43:27 -07:00
// SPDX-License-Identifier: MIT OR Apache-2.0
use alloc::{
string::{String, ToString},
sync::Arc,
vec::Vec,
};
2023-03-12 10:23:54 +01:00
use crate::{Attrs, Font};
2022-11-08 08:43:27 -07:00
/// Access system fonts
#[derive(Debug)]
2023-01-04 20:03:03 -07:00
pub struct FontSystem {
2022-11-08 08:43:27 -07:00
locale: String,
db: fontdb::Database,
}
impl FontSystem {
pub fn new() -> Self {
let locale = "en-US".to_string();
let mut db = fontdb::Database::new();
{
db.set_monospace_family("Fira Mono");
db.set_sans_serif_family("Fira Sans");
db.set_serif_family("DejaVu Serif");
}
2023-01-04 20:03:03 -07:00
Self { locale, db }
2022-11-08 08:43:27 -07:00
}
pub fn new_with_locale_and_db(locale: String, db: fontdb::Database) -> Self {
Self { locale, db }
}
2022-11-08 08:43:27 -07:00
pub fn locale(&self) -> &str {
&self.locale
}
pub fn db(&self) -> &fontdb::Database {
&self.db
}
2023-03-12 10:30:39 +01:00
pub fn db_mut(&mut self) -> &mut fontdb::Database {
&mut self.db
}
2023-03-12 10:23:54 +01:00
pub fn get_font(&self, id: fontdb::ID) -> Option<Arc<Font>> {
2023-03-12 10:30:20 +01:00
get_font(&self.db, id)
2022-11-08 08:43:27 -07:00
}
2023-03-14 00:39:50 +01:00
pub fn get_font_matches(&mut self, attrs: Attrs) -> Arc<Vec<fontdb::ID>> {
let ids = self
.db
.faces()
.filter(|face| attrs.matches(face))
.map(|face| face.id)
.collect::<Vec<_>>();
2022-11-08 08:43:27 -07:00
2023-03-14 00:39:50 +01:00
Arc::new(ids)
2022-11-08 08:43:27 -07:00
}
}
2023-03-12 10:30:20 +01:00
fn get_font(db: &fontdb::Database, id: fontdb::ID) -> Option<Arc<Font>> {
let face = db.face(id)?;
match Font::new(face) {
Some(font) => Some(Arc::new(font)),
None => {
log::warn!("failed to load font '{}'", face.post_script_name);
None
}
}
}