From e34762beae5d5b6b261a2a61433761f9dbd45d37 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Fri, 8 Dec 2023 01:33:33 +0400 Subject: Update to crossfont 0.6.0 --- CHANGELOG.md | 2 ++ Cargo.lock | 27 +++++++++++++++++++++++-- alacritty/Cargo.toml | 2 +- alacritty/src/display/mod.rs | 19 ++++++++++-------- alacritty/src/event.rs | 32 +++++++++++++++++++----------- alacritty/src/input/mod.rs | 10 +++++----- alacritty/src/renderer/text/glyph_cache.rs | 9 ++------- alacritty/src/window_context.rs | 13 ++++-------- 8 files changed, 70 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e383ebde..55692672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). if no exact binding (i.e. one with `Shift`) is found. - Use built-in font for powerline symbols from `U+E0B0` to `U+E0B3` - Default `bell.animation` is now `Linear` +- `IncreaseFontSize/DecreaseFontSize` step is now 1px +- `font.size` precision was raised to 6 floating point digits ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 27a3f445..5157ae6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ dependencies = [ "clap_complete", "cocoa", "copypasta", - "crossfont", + "crossfont 0.6.0", "dirs", "embed-resource", "gl_generator", @@ -584,6 +584,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "crossfont" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c5cf9f7d8f5478dbebc0e7a9ddcd350401e4cd9275d003481d8ec9613b7de1" +dependencies = [ + "cocoa", + "core-foundation", + "core-foundation-sys", + "core-graphics", + "core-text", + "dwrote", + "foreign-types", + "freetype-rs", + "libc", + "log", + "objc", + "once_cell", + "pkg-config", + "servo-fontconfig", + "winapi", +] + [[package]] name = "cursor-icon" version = "1.1.0" @@ -1568,7 +1591,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729a30a469de249c6effc17ec8d039b0aa29b3af79b819b7f51cb6ab8046a90" dependencies = [ - "crossfont", + "crossfont 0.5.2", "log", "smithay-client-toolkit", "tiny-skia", diff --git a/alacritty/Cargo.toml b/alacritty/Cargo.toml index f9d38205..535a933a 100644 --- a/alacritty/Cargo.toml +++ b/alacritty/Cargo.toml @@ -26,7 +26,7 @@ ahash = { version = "0.8.6", features = ["no-rng"] } bitflags = "2.2.1" clap = { version = "4.2.7", features = ["derive", "env"] } copypasta = { version = "0.10.0", default-features = false } -crossfont = { version = "0.5.2", features = ["force_system_fontconfig"] } +crossfont = { version = "0.6.0", features = ["force_system_fontconfig"] } glutin = { version = "0.31.1", default-features = false, features = ["egl", "wgl"] } home = "0.5.5" libc = "0.2" diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs index ef25f735..5b28b252 100644 --- a/alacritty/src/display/mod.rs +++ b/alacritty/src/display/mod.rs @@ -20,7 +20,7 @@ use winit::dpi::PhysicalSize; use winit::keyboard::ModifiersState; use winit::window::CursorIcon; -use crossfont::{self, Rasterize, Rasterizer}; +use crossfont::{self, Rasterize, Rasterizer, Size as FontSize}; use unicode_width::UnicodeWidthChar; use alacritty_terminal::event::{EventListener, OnResize, WindowSize}; @@ -375,6 +375,9 @@ pub struct Display { /// Damage tracker for the given display. pub damage_tracker: DamageTracker, + /// Font size used by the window. + pub font_size: FontSize, + // Mouse point position when highlighting hints. hint_mouse_point: Option, @@ -398,10 +401,12 @@ impl Display { let raw_window_handle = window.raw_window_handle(); let scale_factor = window.scale_factor as f32; - let rasterizer = Rasterizer::new(scale_factor)?; + let rasterizer = Rasterizer::new()?; + let font_size = config.font.size().scale(scale_factor); debug!("Loading \"{}\" font", &config.font.normal().family); - let mut glyph_cache = GlyphCache::new(rasterizer, &config.font)?; + let font = config.font.clone().with_size(font_size); + let mut glyph_cache = GlyphCache::new(rasterizer, &font)?; let metrics = glyph_cache.font_metrics(); let (cell_width, cell_height) = compute_cell_size(config, &metrics); @@ -509,6 +514,7 @@ impl Display { glyph_cache, hint_state, size_info, + font_size, window, pending_renderer_update: Default::default(), vi_highlighted_hint: Default::default(), @@ -566,11 +572,10 @@ impl Display { /// This will return a tuple of the cell width and height. fn update_font_size( glyph_cache: &mut GlyphCache, - scale_factor: f64, config: &UiConfig, font: &Font, ) -> (f32, f32) { - let _ = glyph_cache.update_font_size(font, scale_factor); + let _ = glyph_cache.update_font_size(font); // Compute new cell sizes. compute_cell_size(config, &glyph_cache.font_metrics()) @@ -610,9 +615,7 @@ impl Display { // Update font size and cell dimensions. if let Some(font) = pending_update.font() { - let scale_factor = self.window.scale_factor; - let cell_dimensions = - Self::update_font_size(&mut self.glyph_cache, scale_factor, config, font); + let cell_dimensions = Self::update_font_size(&mut self.glyph_cache, config, font); cell_width = cell_dimensions.0; cell_height = cell_dimensions.1; diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index f19aa2f9..cf77e309 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -1,7 +1,7 @@ //! Process window events. use std::borrow::Cow; -use std::cmp::{max, min}; +use std::cmp::min; use std::collections::{HashMap, HashSet, VecDeque}; use std::error::Error; use std::ffi::OsStr; @@ -14,7 +14,7 @@ use std::time::{Duration, Instant}; use std::{env, f32, mem}; use ahash::RandomState; -use crossfont::{self, Size}; +use crossfont::Size as FontSize; use glutin::display::{Display as GlutinDisplay, GetGlDisplay}; use log::{debug, error, info, warn}; use raw_window_handle::HasRawDisplayHandle; @@ -222,7 +222,6 @@ pub struct ActionContext<'a, N, T> { pub scheduler: &'a mut Scheduler, pub search_state: &'a mut SearchState, pub inline_search_state: &'a mut InlineSearchState, - pub font_size: &'a mut Size, pub dirty: &'a mut bool, pub occluded: &'a mut bool, pub preserve_title: bool, @@ -464,15 +463,19 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext for ActionCon } } - fn change_font_size(&mut self, delta: f32) { - *self.font_size = max(*self.font_size + delta, Size::new(FONT_SIZE_STEP)); - let font = self.config.font.clone().with_size(*self.font_size); + fn change_font_size(&mut self, delta: i32) { + let new_size = (self.display.font_size.as_px() as i32 + delta).clamp(1, u16::MAX as i32); + self.display.font_size = FontSize::from_px(new_size as u16); + let font = self.config.font.clone().with_size(self.display.font_size); self.display.pending_update.set_font(font); } fn reset_font_size(&mut self) { - *self.font_size = self.config.font.size(); - self.display.pending_update.set_font(self.config.font.clone()); + let scale_factor = self.display.window.scale_factor as f32; + self.display.font_size = self.config.font.size().scale(scale_factor); + self.display + .pending_update + .set_font(self.config.font.clone().with_size(self.display.font_size)); } #[inline] @@ -1165,7 +1168,8 @@ impl TouchZoom { // Calculate font change in `FONT_SIZE_STEP` increments. let delta = (self.distance() - old_distance) * TOUCH_ZOOM_FACTOR + self.fractions; - let font_delta = (delta.abs() / FONT_SIZE_STEP).floor() * FONT_SIZE_STEP * delta.signum(); + let font_delta = + (delta.abs() / FONT_SIZE_STEP as f32).floor() * FONT_SIZE_STEP as f32 * delta.signum(); self.fractions = delta - font_delta; font_delta @@ -1354,13 +1358,17 @@ impl input::Processor> { match event { WindowEvent::CloseRequested => self.ctx.terminal.exit(), WindowEvent::ScaleFactorChanged { scale_factor, .. } => { - self.ctx.window().scale_factor = scale_factor; + let old_scale_factor = + mem::replace(&mut self.ctx.window().scale_factor, scale_factor); let display_update_pending = &mut self.ctx.display.pending_update; - // Push current font to update its scale factor. + // Rescale font size for the new factor. + let font_scale = scale_factor as f32 / old_scale_factor as f32; + self.ctx.display.font_size = self.ctx.display.font_size.scale(font_scale); + let font = self.ctx.config.font.clone(); - display_update_pending.set_font(font.with_size(*self.ctx.font_size)); + display_update_pending.set_font(font.with_size(self.ctx.display.font_size)); }, WindowEvent::Resized(size) => { // Ignore resize events to zero in any dimension, to avoid issues with Winit diff --git a/alacritty/src/input/mod.rs b/alacritty/src/input/mod.rs index 584b8240..e811e4c4 100644 --- a/alacritty/src/input/mod.rs +++ b/alacritty/src/input/mod.rs @@ -47,8 +47,8 @@ use crate::scheduler::{Scheduler, TimerId, Topic}; pub mod keyboard; -/// Font size change interval. -pub const FONT_SIZE_STEP: f32 = 0.5; +/// Font size change interval in px. +pub const FONT_SIZE_STEP: i32 = 1; /// Interval for mouse scrolling during selection outside of the boundaries. const SELECTION_SCROLLING_INTERVAL: Duration = Duration::from_millis(15); @@ -98,7 +98,7 @@ pub trait ActionContext { fn create_new_window(&mut self, _tabbing_id: Option) {} #[cfg(not(target_os = "macos"))] fn create_new_window(&mut self) {} - fn change_font_size(&mut self, _delta: f32) {} + fn change_font_size(&mut self, _delta: i32) {} fn reset_font_size(&mut self) {} fn pop_message(&mut self) {} fn message(&self) -> Option<&Message>; @@ -321,7 +321,7 @@ impl Execute for Action { Action::Minimize => ctx.window().set_minimized(true), Action::Quit => ctx.terminal_mut().exit(), Action::IncreaseFontSize => ctx.change_font_size(FONT_SIZE_STEP), - Action::DecreaseFontSize => ctx.change_font_size(FONT_SIZE_STEP * -1.), + Action::DecreaseFontSize => ctx.change_font_size(-FONT_SIZE_STEP), Action::ResetFontSize => ctx.reset_font_size(), Action::ScrollPageUp | Action::ScrollPageDown @@ -865,7 +865,7 @@ impl> Processor { }, TouchPurpose::Zoom(zoom) => { let font_delta = zoom.font_delta(touch); - self.ctx.change_font_size(font_delta); + self.ctx.change_font_size(font_delta as i32); }, TouchPurpose::Scroll(last_touch) => { // Calculate delta and update last touch position. diff --git a/alacritty/src/renderer/text/glyph_cache.rs b/alacritty/src/renderer/text/glyph_cache.rs index a750e4e7..957cde1a 100644 --- a/alacritty/src/renderer/text/glyph_cache.rs +++ b/alacritty/src/renderer/text/glyph_cache.rs @@ -275,13 +275,8 @@ impl GlyphCache { /// /// NOTE: To reload the renderers's fonts [`Self::reset_glyph_cache`] should be called /// afterwards. - pub fn update_font_size( - &mut self, - font: &Font, - scale_factor: f64, - ) -> Result<(), crossfont::Error> { + pub fn update_font_size(&mut self, font: &Font) -> Result<(), crossfont::Error> { // Update dpi scaling. - self.rasterizer.update_dpr(scale_factor as f32); self.font_offset = font.offset; self.glyph_offset = font.glyph_offset; @@ -296,7 +291,7 @@ impl GlyphCache { })?; let metrics = self.rasterizer.metrics(regular, font.size())?; - info!("Font size changed to {:?} with scale factor of {}", font.size(), scale_factor); + info!("Font size changed to {:?} px", font.size().as_px()); self.font_size = font.size(); self.font_key = regular; diff --git a/alacritty/src/window_context.rs b/alacritty/src/window_context.rs index c5b00085..724a5515 100644 --- a/alacritty/src/window_context.rs +++ b/alacritty/src/window_context.rs @@ -9,7 +9,6 @@ use std::os::unix::io::{AsRawFd, RawFd}; use std::rc::Rc; use std::sync::Arc; -use crossfont::Size; use glutin::config::GetGlConfig; use glutin::display::GetGlDisplay; #[cfg(all(feature = "x11", not(any(target_os = "macos", windows))))] @@ -56,7 +55,6 @@ pub struct WindowContext { inline_search_state: InlineSearchState, search_state: SearchState, notifier: Notifier, - font_size: Size, mouse: Mouse, touch: TouchPurpose, occluded: bool, @@ -239,12 +237,9 @@ impl WindowContext { event_proxy.send_event(TerminalEvent::CursorBlinkingChange.into()); } - let font_size = config.font.size(); - // Create context for the Alacritty window. Ok(WindowContext { preserve_title, - font_size, terminal, display, #[cfg(not(windows))] @@ -283,12 +278,13 @@ impl WindowContext { } if old_config.font != self.config.font { + let scale_factor = self.display.window.scale_factor as f32; // Do not update font size if it has been changed at runtime. - if self.font_size == old_config.font.size() { - self.font_size = self.config.font.size(); + if self.display.font_size == old_config.font.size().scale(scale_factor) { + self.display.font_size = self.config.font.size().scale(scale_factor); } - let font = self.config.font.clone().with_size(self.font_size); + let font = self.config.font.clone().with_size(self.display.font_size); self.display.pending_update.set_font(font); } @@ -435,7 +431,6 @@ impl WindowContext { inline_search_state: &mut self.inline_search_state, search_state: &mut self.search_state, modifiers: &mut self.modifiers, - font_size: &mut self.font_size, notifier: &mut self.notifier, display: &mut self.display, mouse: &mut self.mouse, -- cgit v1.2.3-54-g00ecf