diff --git a/alacritty/src/display/damage.rs b/alacritty/src/display/damage.rs index 24033fa5..450643b7 100644 --- a/alacritty/src/display/damage.rs +++ b/alacritty/src/display/damage.rs @@ -164,11 +164,19 @@ impl FrameDamage { self.full = true; } - /// Add a damage rectangle. + /// Add viewport rectangle to damage. /// /// This allows covering elements outside of the terminal viewport, like message bar. #[inline] - pub fn add_rect(&mut self, x: i32, y: i32, width: i32, height: i32) { + pub fn add_viewport_rect( + &mut self, + size_info: &SizeInfo, + x: i32, + y: i32, + width: i32, + height: i32, + ) { + let y = viewport_y_to_damage_y(size_info, y, height); self.rects.push(Rect { x, y, width, height }); } @@ -183,6 +191,16 @@ impl FrameDamage { } } +/// Convert viewport `y` coordinate to [`Rect`] damage coordinate. +pub fn viewport_y_to_damage_y(size_info: &SizeInfo, y: i32, height: i32) -> i32 { + size_info.height() as i32 - y - height +} + +/// Convert viewport `y` coordinate to [`Rect`] damage coordinate. +pub fn damage_y_to_viewport_y(size_info: &SizeInfo, rect: &Rect) -> i32 { + size_info.height() as i32 - rect.y - rect.height +} + /// Iterator which converts `alacritty_terminal` damage information into renderer damaged rects. struct RenderDamageIterator<'a> { damaged_lines: Peekable>, @@ -316,4 +334,24 @@ mod tests { rect ); } + + #[test] + fn add_viewport_damage() { + let mut frame_damage = FrameDamage::default(); + let viewport_height = 100.; + let x = 0; + let y = 40; + let height = 5; + let width = 10; + let size_info = SizeInfo::new(viewport_height, viewport_height, 5., 5., 0., 0., true); + frame_damage.add_viewport_rect(&size_info, x, y, width, height); + assert_eq!(frame_damage.rects[0], Rect { + x, + y: viewport_height as i32 - y - height, + width, + height + }); + assert_eq!(frame_damage.rects[0].y, viewport_y_to_damage_y(&size_info, y, height)); + assert_eq!(damage_y_to_viewport_y(&size_info, &frame_damage.rects[0]), y); + } } diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs index 5b28b252..dc37794d 100644 --- a/alacritty/src/display/mod.rs +++ b/alacritty/src/display/mod.rs @@ -43,7 +43,7 @@ use crate::display::bell::VisualBell; use crate::display::color::{List, Rgb}; use crate::display::content::{RenderableContent, RenderableCursor}; use crate::display::cursor::IntoRects; -use crate::display::damage::DamageTracker; +use crate::display::damage::{damage_y_to_viewport_y, DamageTracker}; use crate::display::hint::{HintMatch, HintState}; use crate::display::meter::Meter; use crate::display::window::Window; @@ -935,7 +935,7 @@ impl Display { rects.push(message_bar_rect); // Always damage message bar, since it could have messages of the same size in it. - self.damage_tracker.frame().add_rect(x, y as i32, width, height); + self.damage_tracker.frame().add_viewport_rect(&size_info, x, y as i32, width, height); // Draw rectangles. self.renderer.draw_rects(&size_info, &metrics, rects); @@ -1327,7 +1327,7 @@ impl Display { let x = damage_rect.x as f32; let height = damage_rect.height as f32; let width = damage_rect.width as f32; - let y = self.size_info.height() - damage_rect.y as f32 - height; + let y = damage_y_to_viewport_y(&self.size_info, damage_rect) as f32; let render_rect = RenderRect::new(x, y, width, height, DAMAGE_RECT_COLOR, 0.5); render_rects.push(render_rect);