1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-26 08:25:50 +03:00

add some docs, make slightly more efficient when computing cluster size vec

This commit is contained in:
Wez Furlong 2018-01-17 00:17:22 -08:00
parent 93c10590ca
commit df64bce18a
2 changed files with 26 additions and 6 deletions

View File

@ -8,18 +8,28 @@ pub mod fcwrap;
pub use self::fcwrap::Pattern as FontPattern; pub use self::fcwrap::Pattern as FontPattern;
/// Holds information about a shaped glyph
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct GlyphInfo { pub struct GlyphInfo {
/// We only retain text in debug mode for diagnostic purposes /// We only retain text in debug mode for diagnostic purposes
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
pub text: String, pub text: String,
pub num_cells: u8, /// Offset within text
pub font_idx: usize, #[cfg(debug_assertions)]
pub glyph_pos: u32,
pub cluster: u32, pub cluster: u32,
/// How many cells/columns this glyph occupies horizontally
pub num_cells: u8,
/// Which font alternative to use; index into Font.fonts
pub font_idx: usize,
/// Which freetype glyph to load
pub glyph_pos: u32,
/// How far to advance the render cursor after drawing this glyph
pub x_advance: i32, pub x_advance: i32,
/// How far to advance the render cursor after drawing this glyph
pub y_advance: i32, pub y_advance: i32,
/// Destination render offset
pub x_offset: i32, pub x_offset: i32,
/// Destination render offset
pub y_offset: i32, pub y_offset: i32,
} }
@ -46,13 +56,18 @@ impl GlyphInfo {
} }
} }
/// Holds a loaded font alternative
struct FontInfo { struct FontInfo {
face: ftwrap::Face, face: ftwrap::Face,
font: hbwrap::Font, font: hbwrap::Font,
/// nominal monospace cell height
cell_height: i64, cell_height: i64,
/// nominal monospace cell width
cell_width: i64, cell_width: i64,
} }
/// Holds "the" font selected by the user. In actuality, it
/// holds the set of fallback fonts that match their criteria
pub struct Font { pub struct Font {
lib: ftwrap::Library, lib: ftwrap::Library,
pattern: fcwrap::Pattern, pattern: fcwrap::Pattern,
@ -69,16 +84,21 @@ impl Drop for Font {
} }
impl Font { impl Font {
/// Construct a new Font from the user supplied pattern
pub fn new(mut pattern: FontPattern) -> Result<Font, Error> { pub fn new(mut pattern: FontPattern) -> Result<Font, Error> {
let mut lib = ftwrap::Library::new()?; let mut lib = ftwrap::Library::new()?;
lib.set_lcd_filter( lib.set_lcd_filter(
ftwrap::FT_LcdFilter::FT_LCD_FILTER_DEFAULT, ftwrap::FT_LcdFilter::FT_LCD_FILTER_DEFAULT,
)?; )?;
//pattern.family("Operator Mono SSm")?; // Enable some filtering options and pull in the standard
// fallback font selection from the user configuration
pattern.monospace()?; pattern.monospace()?;
pattern.config_substitute(fcwrap::MatchKind::Pattern)?; pattern.config_substitute(fcwrap::MatchKind::Pattern)?;
pattern.default_substitute(); pattern.default_substitute();
// and obtain the selection with the best preference
// at index 0.
let font_list = pattern.sort(true)?; let font_list = pattern.sort(true)?;
Ok(Font { Ok(Font {
@ -197,7 +217,7 @@ impl Font {
// the fragments to properly handle fallback, // the fragments to properly handle fallback,
// and they're handy to have for debugging // and they're handy to have for debugging
// purposes too. // purposes too.
let mut sizes = Vec::new(); let mut sizes = Vec::with_capacity(s.len());
for (i, info) in infos.iter().enumerate() { for (i, info) in infos.iter().enumerate() {
let pos = info.cluster as usize; let pos = info.cluster as usize;
let mut size = 1; let mut size = 1;

View File

@ -147,7 +147,7 @@ fn glyphs_for_text<'a, T>(
s: &str, s: &str,
) -> Result<Vec<Glyph<'a>>, Error> { ) -> Result<Vec<Glyph<'a>>, Error> {
let pattern = FontPattern::parse("Operator Mono SSm:size=12:weight=SemiLight")?; let pattern = FontPattern::parse("Operator Mono SSm Lig:size=12:weight=SemiLight")?;
let mut font = Font::new(pattern)?; let mut font = Font::new(pattern)?;
// We always load the cell_height for font 0, // We always load the cell_height for font 0,