1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-23 23:21:08 +03:00

term: respect row/column scaling for image attachments

This got lost along the way somewhere, but now it's back!

refs: https://github.com/Canop/broot/issues/473
This commit is contained in:
Wez Furlong 2022-01-05 18:24:21 -07:00
parent 1dc5af5e69
commit 2a0de16b7b

View File

@ -76,6 +76,8 @@ impl TerminalState {
.min(params.image_height)
.min(avail_height);
let aspect = source_width as f32 / source_height as f32;
let width_in_cells = params
.columns
.unwrap_or_else(|| (source_width as f32 / cell_pixel_width as f32).ceil() as usize);
@ -83,6 +85,27 @@ impl TerminalState {
.rows
.unwrap_or_else(|| (source_height as f32 / cell_pixel_height as f32).ceil() as usize);
// Figure out the desired pixel dimensions, respecting the original
// aspect of the picture if they specific rows/columns as the max size.
let target_pixel_width = if params.columns.is_some() {
if source_width > source_height {
width_in_cells * cell_pixel_width
} else {
((height_in_cells * cell_pixel_height) as f32 * aspect).ceil() as usize
}
} else {
source_width as usize
};
let target_pixel_height = if params.rows.is_some() {
if source_height > source_width {
height_in_cells * cell_pixel_height
} else {
((width_in_cells * cell_pixel_width) as f32 / aspect).ceil() as usize
}
} else {
source_height as usize
};
let first_row = self.screen().visible_row_to_stable_row(self.cursor.y);
let mut ypos = NotNan::new(params.source_origin_y as f32 / params.image_height as f32)
@ -92,11 +115,13 @@ impl TerminalState {
let cursor_x = self.cursor.x;
log::debug!(
"image is {}x{} cells (cell is {}x{}), {:?}, ({}x{}@{}x{})",
"image is {}x{} cells (cell is {}x{}), target pixel dims {}x{}, {:?}, (term is {}x{}@{}x{})",
width_in_cells,
height_in_cells,
cell_pixel_width,
cell_pixel_height,
target_pixel_width,
target_pixel_height,
params,
physical_cols,
physical_rows,
@ -110,10 +135,10 @@ impl TerminalState {
height_in_cells
};
let mut remain_y = source_height as usize;
let mut remain_y = target_pixel_height as usize;
for y in 0..height_in_cells {
let padding_bottom = cell_pixel_height.saturating_sub(remain_y) as u16;
let y_delta = (remain_y.min(cell_pixel_height) as f32) / (source_height as f32);
let y_delta = (remain_y.min(cell_pixel_height) as f32) / (target_pixel_height as f32);
remain_y = remain_y.saturating_sub(cell_pixel_height);
let mut xpos = start_xpos;
@ -128,10 +153,10 @@ impl TerminalState {
cursor_x,
cursor_x + width_in_cells
);
let mut remain_x = source_width as usize;
let mut remain_x = target_pixel_width as usize;
for x in 0..width_in_cells {
let padding_right = cell_pixel_width.saturating_sub(remain_x) as u16;
let x_delta = (remain_x.min(cell_pixel_width) as f32) / (source_width as f32);
let x_delta = (remain_x.min(cell_pixel_width) as f32) / (target_pixel_width as f32);
log::debug!(
"x_delta {} ({} px), y_delta {} ({} px), padding_right={}, padding_bottom={}",
x_delta,