aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Duerr <chrisduerr@users.noreply.github.com>2018-11-12 18:23:23 +0000
committerGitHub <noreply@github.com>2018-11-12 18:23:23 +0000
commitd05d16f023b27fc4707478668db73d6860918956 (patch)
tree521c4fae62fba369712e0bb4ffb56dc7f2103cc9 /src
parent4a8d18cdee2d0a11feb639e7f19d6f7df07cec83 (diff)
downloadalacritty-d05d16f023b27fc4707478668db73d6860918956.tar.gz
alacritty-d05d16f023b27fc4707478668db73d6860918956.zip
Fix incorrect padding calculations
The extra window padding was calculated in the renderer which lead to problems with the paddings calculated in the `src/display.rs` and `src/term/mod.rs`. As a solution, every instance of `config.padding().x/y` has been removed from the renderer (`src/renderer/mod.rs`), instead the padding is always passed through from the `src/display.rs`. The initial calculations during display creation and after resize then are scaled appropriately and then the extra padding is calculated. As a result every other location can just make use of the correctly calculated `size_info.padding_x` and `size_info.padding_y`. The documentation has been changed to clearly state that the padding is scaled by DPI now. This fixes #1773.
Diffstat (limited to 'src')
-rw-r--r--src/display.rs60
-rw-r--r--src/renderer/mod.rs47
2 files changed, 50 insertions, 57 deletions
diff --git a/src/display.rs b/src/display.rs
index 5fbaf44a..e170c152 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -144,28 +144,34 @@ impl Display {
.expect("glutin returns window size").to_physical(dpr);
// Create renderer
- let mut renderer = QuadRenderer::new(config, viewport_size, dpr)?;
+ let mut renderer = QuadRenderer::new(viewport_size)?;
let (glyph_cache, cell_width, cell_height) =
Self::new_glyph_cache(dpr, &mut renderer, config)?;
-
let dimensions = options.dimensions()
.unwrap_or_else(|| config.dimensions());
- // Resize window to specified dimensions unless one or both dimensions are 0
- if dimensions.columns_u32() > 0 && dimensions.lines_u32() > 0 {
- let width = cell_width as u32 * dimensions.columns_u32();
- let height = cell_height as u32 * dimensions.lines_u32();
+ debug_assert!(dimensions.columns_u32() > 0);
+ debug_assert!(dimensions.lines_u32() > 0);
- let new_viewport_size = PhysicalSize::new(
- f64::from(width + 2 * (f64::from(config.padding().x) * dpr) as u32),
- f64::from(height + 2 * (f64::from(config.padding().y) * dpr) as u32) as f64);
+ let width = cell_width as u32 * dimensions.columns_u32();
+ let height = cell_height as u32 * dimensions.lines_u32();
- window.set_inner_size(new_viewport_size.to_logical(dpr));
- renderer.resize(new_viewport_size, dpr, cell_width as i32, cell_height as i32);
- viewport_size = new_viewport_size;
- }
+ let mut padding_x = f64::from(config.padding().x) * dpr;
+ let mut padding_y = f64::from(config.padding().y) * dpr;
+ padding_x = padding_x + (f64::from(width) - 2. * padding_x) % f64::from(cell_width) / 2.;
+ padding_y = padding_y + (f64::from(height) - 2. * padding_y) % f64::from(cell_height) / 2.;
+ padding_x = padding_x.floor();
+ padding_y = padding_y.floor();
+
+ viewport_size = PhysicalSize::new(
+ f64::from(width) + 2. * padding_x,
+ f64::from(height) + 2. * padding_y,
+ );
+
+ window.set_inner_size(viewport_size.to_logical(dpr));
+ renderer.resize(viewport_size, padding_x as f32, padding_y as f32);
info!("Cell Size: ({} x {})", cell_width, cell_height);
@@ -175,8 +181,8 @@ impl Display {
height: viewport_size.height as f32,
cell_width: cell_width as f32,
cell_height: cell_height as f32,
- padding_x: (f64::from(config.padding().x) * dpr).floor() as f32,
- padding_y: (f64::from(config.padding().y) * dpr).floor() as f32,
+ padding_x: padding_x as f32,
+ padding_y: padding_y as f32,
};
// Channel for resize events
@@ -302,16 +308,27 @@ impl Display {
self.font_size = terminal.font_size;
self.size_info.dpr = dpr;
- self.size_info.padding_x = (f64::from(config.padding().x) * dpr).floor() as f32;
- self.size_info.padding_y = (f64::from(config.padding().y) * dpr).floor() as f32;
+
self.update_glyph_cache(config);
}
// Receive any resize events; only call gl::Viewport on last
// available
if let Some(psize) = new_size.take() {
- self.size_info.width = psize.width as f32;
- self.size_info.height = psize.height as f32;
+ let width = psize.width as f32;
+ let height = psize.height as f32;
+ let cell_width = self.size_info.cell_width;
+ let cell_height = self.size_info.cell_height;
+
+ self.size_info.width = width;
+ self.size_info.height = height;
+
+ let mut padding_x = f32::from(config.padding().x) * dpr as f32;
+ let mut padding_y = f32::from(config.padding().y) * dpr as f32;
+ padding_x = (padding_x + ((width - 2. * padding_x) % cell_width) / 2.).floor();
+ padding_y = (padding_y + ((height - 2. * padding_y) % cell_height) / 2.).floor();
+ self.size_info.padding_x = padding_x;
+ self.size_info.padding_y = padding_y;
let size = &self.size_info;
terminal.resize(size);
@@ -320,11 +337,8 @@ impl Display {
item.on_resize(size)
}
- let cw = self.size_info.cell_width as i32;
- let ch = self.size_info.cell_height as i32;
-
self.window.resize(psize);
- self.renderer.resize(psize, dpr, cw, ch);
+ self.renderer.resize(psize, padding_x, padding_y);
}
}
diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs
index 8e0fc60b..1a193caf 100644
--- a/src/renderer/mod.rs
+++ b/src/renderer/mod.rs
@@ -118,9 +118,6 @@ pub struct ShaderProgram {
///
/// Rendering is split into two passes; 1 for backgrounds, and one for text
u_background: GLint,
-
- padding_x: u8,
- padding_y: u8,
}
#[derive(Debug, Clone)]
@@ -472,8 +469,8 @@ const ATLAS_SIZE: i32 = 1024;
impl QuadRenderer {
// TODO should probably hand this a transform instead of width/height
- pub fn new(config: &Config, size: PhysicalSize, dpr: f64) -> Result<QuadRenderer, Error> {
- let program = ShaderProgram::new(config, size, dpr)?;
+ pub fn new(size: PhysicalSize) -> Result<QuadRenderer, Error> {
+ let program = ShaderProgram::new(size)?;
let mut vao: GLuint = 0;
let mut vbo: GLuint = 0;
@@ -668,7 +665,7 @@ impl QuadRenderer {
while let Ok(msg) = self.rx.try_recv() {
match msg {
Msg::ShaderReload => {
- self.reload_shaders(config, PhysicalSize::new(f64::from(props.width), f64::from(props.height)), props.dpr);
+ self.reload_shaders(PhysicalSize::new(f64::from(props.width), f64::from(props.height)));
}
}
}
@@ -720,9 +717,9 @@ impl QuadRenderer {
})
}
- pub fn reload_shaders(&mut self, config: &Config, size: PhysicalSize, dpr: f64) {
+ pub fn reload_shaders(&mut self, size: PhysicalSize) {
warn!("Reloading shaders ...");
- let program = match ShaderProgram::new(config, size, dpr) {
+ let program = match ShaderProgram::new(size) {
Ok(program) => {
warn!(" ... OK");
program
@@ -748,30 +745,21 @@ impl QuadRenderer {
self.program = program;
}
- pub fn resize(&mut self, size: PhysicalSize, dpr: f64, cell_width: i32, cell_height: i32) {
+ pub fn resize(&mut self, size: PhysicalSize, padding_x: f32, padding_y: f32) {
let (width, height): (u32, u32) = size.into();
- let (width, height) = (width as i32, height as i32);
-
- let mut padding_x = (f64::from(self.program.padding_x) * dpr) as i32;
- let mut padding_y = (f64::from(self.program.padding_y) * dpr) as i32;
-
- // Add padding to center the grid inside the window
- padding_y += ((height - 2 * padding_y) % cell_height) / 2;
- padding_x += ((width - 2 * padding_x) % cell_width) / 2;
// viewport
unsafe {
+ let width = width as i32;
+ let height = height as i32;
+ let padding_x = padding_x as i32;
+ let padding_y = padding_y as i32;
gl::Viewport(padding_x, padding_y, width - 2 * padding_x, height - 2 * padding_y);
}
// update projection
self.program.activate();
- self.program.update_projection(
- width as f32,
- height as f32,
- padding_x as f32,
- padding_y as f32,
- );
+ self.program.update_projection(width as f32, height as f32, padding_x, padding_y);
self.program.deactivate();
}
}
@@ -1007,11 +995,7 @@ impl ShaderProgram {
}
}
- pub fn new(
- config: &Config,
- size: PhysicalSize,
- dpr: f64
- ) -> Result<ShaderProgram, ShaderCreationError> {
+ pub fn new(size: PhysicalSize) -> Result<ShaderProgram, ShaderCreationError> {
let vertex_source = if cfg!(feature = "live-shader-reload") {
None
} else {
@@ -1061,9 +1045,6 @@ impl ShaderProgram {
assert_uniform_valid!(projection, term_dim, cell_dim);
- let padding_x = (f32::from(config.padding().x) * dpr as f32).floor();
- let padding_y = (f32::from(config.padding().y) * dpr as f32).floor();
-
let shader = ShaderProgram {
id: program,
u_projection: projection,
@@ -1071,11 +1052,9 @@ impl ShaderProgram {
u_cell_dim: cell_dim,
u_visual_bell: visual_bell,
u_background: background,
- padding_x: padding_x as u8,
- padding_y: padding_y as u8,
};
- shader.update_projection(size.width as f32, size.height as f32, padding_x, padding_y);
+ shader.update_projection(size.width as f32, size.height as f32, 0., 0.);
shader.deactivate();