diff --git a/CHANGELOG.md b/CHANGELOG.md index cd09659e..879febdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Changed + +- Accept fonts which are smaller in width or height than a single pixel + +### Fixed + +- Incorrect font spacing after moving Alacritty between displays + ## Version 0.2.8 ### Added diff --git a/src/display.rs b/src/display.rs index ae47b9e3..4873e02a 100644 --- a/src/display.rs +++ b/src/display.rs @@ -43,9 +43,6 @@ pub enum Error { /// Error in renderer Render(renderer::Error), - - /// Computed cell size is invalid - InvalidCellSize, } impl ::std::error::Error for Error { @@ -54,7 +51,6 @@ impl ::std::error::Error for Error { Error::Window(ref err) => Some(err), Error::Font(ref err) => Some(err), Error::Render(ref err) => Some(err), - Error::InvalidCellSize => None, } } @@ -63,19 +59,16 @@ impl ::std::error::Error for Error { Error::Window(ref err) => err.description(), Error::Font(ref err) => err.description(), Error::Render(ref err) => err.description(), - Error::InvalidCellSize => "cell size is invalid", } } } impl ::std::fmt::Display for Error { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - use std::error::Error as StdError; match *self { Error::Window(ref err) => err.fmt(f), Error::Font(ref err) => err.fmt(f), Error::Render(ref err) => err.fmt(f), - Error::InvalidCellSize => write!(f, "{}", self.description()), } } } @@ -262,45 +255,32 @@ impl Display { // Need font metrics to resize the window properly. This suggests to me the // font metrics should be computed before creating the window in the first // place so that a resize is not needed. - let (cell_width, cell_height) = - Self::compute_cell_size(&config, &glyph_cache.font_metrics())?; + let (cw, ch) = Self::compute_cell_size(config, &glyph_cache.font_metrics()); - Ok((glyph_cache, cell_width, cell_height)) + Ok((glyph_cache, cw, ch)) } - fn compute_cell_size(config: &Config, metrics: &font::Metrics) -> Result<(f32, f32), Error> { - let cell_width = - ((metrics.average_advance + f64::from(config.font().offset().x)) as f32).floor(); - let cell_height = - ((metrics.line_height + f64::from(config.font().offset().y)) as f32).floor(); - - if cell_width < 1. || cell_height < 1. { - return Err(Error::InvalidCellSize) - } - - Ok((cell_width, cell_height)) - } - - pub fn update_glyph_cache( - &mut self, - config: &Config, - size: font::Size - ) -> Result<(), Error> { - let dpr = self.size_info.dpr; + pub fn update_glyph_cache(&mut self, config: &Config) { let cache = &mut self.glyph_cache; - - let (cell_width, cell_height) = Self::compute_cell_size(config, &cache.font_metrics())?; - - self.font_size = size; + let dpr = self.size_info.dpr; + let size = self.font_size; self.renderer.with_loader(|mut api| { let _ = cache.update_font_size(config.font(), size, dpr, &mut api); }); - self.size_info.cell_width = cell_width; - self.size_info.cell_height = cell_height; + let (cw, ch) = Self::compute_cell_size(config, &cache.font_metrics()); + self.size_info.cell_width = cw; + self.size_info.cell_height = ch; + } - Ok(()) + fn compute_cell_size(config: &Config, metrics: &font::Metrics) -> (f32, f32) { + let offset_x = f64::from(config.font().offset().x); + let offset_y = f64::from(config.font().offset().y); + ( + f32::max(1., ((metrics.average_advance + offset_x) as f32).floor()), + f32::max(1., ((metrics.line_height + offset_y) as f32).floor()), + ) } #[inline] @@ -346,13 +326,13 @@ impl Display { )); } + self.font_size = terminal.font_size; self.last_message = terminal.message_buffer_mut().message(); self.size_info.dpr = dpr; } - if font_changed && self.update_glyph_cache(config, terminal.font_size).is_err() { - // Revert the terminal font size back to last known good state - terminal.font_size = self.font_size; + if font_changed { + self.update_glyph_cache(config); } if let Some(psize) = new_size.take() {