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:
parent
e12c750edb
commit
c0c267d60e
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue