Fix message bar not damaged when the same size

The regression was added due to `y` coordinate in OpenGL differs to
`y` inside the damage rectangles.

Fixes: 40160c5d (Damage only terminal inside `alacritty_terminal`)
This commit is contained in:
Kirill Chibisov 2023-12-08 23:25:05 +04:00 committed by GitHub
parent e12c750edb
commit c0c267d60e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 5 deletions

View File

@ -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<TermDamageIterator<'a>>,
@ -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);
}
}

View File

@ -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);