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;
|
self.full = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a damage rectangle.
|
/// Add viewport rectangle to damage.
|
||||||
///
|
///
|
||||||
/// This allows covering elements outside of the terminal viewport, like message bar.
|
/// This allows covering elements outside of the terminal viewport, like message bar.
|
||||||
#[inline]
|
#[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 });
|
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.
|
/// Iterator which converts `alacritty_terminal` damage information into renderer damaged rects.
|
||||||
struct RenderDamageIterator<'a> {
|
struct RenderDamageIterator<'a> {
|
||||||
damaged_lines: Peekable<TermDamageIterator<'a>>,
|
damaged_lines: Peekable<TermDamageIterator<'a>>,
|
||||||
|
@ -316,4 +334,24 @@ mod tests {
|
||||||
rect
|
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::color::{List, Rgb};
|
||||||
use crate::display::content::{RenderableContent, RenderableCursor};
|
use crate::display::content::{RenderableContent, RenderableCursor};
|
||||||
use crate::display::cursor::IntoRects;
|
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::hint::{HintMatch, HintState};
|
||||||
use crate::display::meter::Meter;
|
use crate::display::meter::Meter;
|
||||||
use crate::display::window::Window;
|
use crate::display::window::Window;
|
||||||
|
@ -935,7 +935,7 @@ impl Display {
|
||||||
rects.push(message_bar_rect);
|
rects.push(message_bar_rect);
|
||||||
|
|
||||||
// Always damage message bar, since it could have messages of the same size in it.
|
// 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.
|
// Draw rectangles.
|
||||||
self.renderer.draw_rects(&size_info, &metrics, rects);
|
self.renderer.draw_rects(&size_info, &metrics, rects);
|
||||||
|
@ -1327,7 +1327,7 @@ impl Display {
|
||||||
let x = damage_rect.x as f32;
|
let x = damage_rect.x as f32;
|
||||||
let height = damage_rect.height as f32;
|
let height = damage_rect.height as f32;
|
||||||
let width = damage_rect.width 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);
|
let render_rect = RenderRect::new(x, y, width, height, DAMAGE_RECT_COLOR, 0.5);
|
||||||
|
|
||||||
render_rects.push(render_rect);
|
render_rects.push(render_rect);
|
||||||
|
|
Loading…
Reference in New Issue