Freeze inverted status during paused rendering

This commit is contained in:
Kovid Goyal 2023-12-25 12:34:05 +05:30
parent 6c2ef90033
commit aeb60edf55
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
3 changed files with 6 additions and 7 deletions

View file

@ -1986,9 +1986,7 @@ screen_erase_characters(Screen *self, unsigned int count) {
bool
screen_invert_colors(Screen *self) {
bool inverted = false;
if (self->modes.mDECSCNM) inverted = true;
return inverted;
return self->paused_rendering.expires_at ? self->paused_rendering.inverted : (self->modes.mDECSCNM ? true : false);
}
void
@ -2374,6 +2372,7 @@ screen_pause_rendering(Screen *self, bool pause, int for_in_ms) {
if (self->paused_rendering.expires_at) return false;
if (for_in_ms <= 0) for_in_ms = 2000;
self->paused_rendering.expires_at = monotonic() + ms_to_monotonic_t(for_in_ms);
self->paused_rendering.inverted = self->modes.mDECSCNM ? true : false;
memcpy(&self->paused_rendering.cursor, self->cursor, sizeof(self->paused_rendering.cursor));
memcpy(&self->paused_rendering.color_profile, self->color_profile, sizeof(self->paused_rendering.color_profile));
return true;

View file

@ -154,6 +154,7 @@ typedef struct {
monotonic_t expires_at;
Cursor cursor;
ColorProfile color_profile;
bool inverted;
} paused_rendering;
} Screen;

View file

@ -290,7 +290,7 @@ pick_cursor_color(Line *line, const ColorProfile *color_profile, color_type cell
}
static void
cell_update_uniform_block(ssize_t vao_idx, Screen *screen, int uniform_buffer, const CellRenderData *crd, CursorRenderInfo *cursor, bool inverted, OSWindow *os_window) {
cell_update_uniform_block(ssize_t vao_idx, Screen *screen, int uniform_buffer, const CellRenderData *crd, CursorRenderInfo *cursor, OSWindow *os_window) {
struct GPUCellRenderData {
GLfloat xstart, ystart, dx, dy, sprite_dx, sprite_dy, background_opacity, use_cell_bg_for_selection_fg, use_cell_fg_for_selection_color, use_cell_for_selection_bg;
@ -365,7 +365,7 @@ cell_update_uniform_block(ssize_t vao_idx, Screen *screen, int uniform_buffer, c
unsigned int x, y, z;
sprite_tracker_current_layout(os_window->fonts_data, &x, &y, &z);
rd->sprite_dx = 1.0f / (float)x; rd->sprite_dy = 1.0f / (float)y;
rd->inverted = inverted ? 1 : 0;
rd->inverted = screen_invert_colors(screen) ? 1 : 0;
rd->background_opacity = os_window->is_semi_transparent ? os_window->background_opacity : 1.0f;
#undef COLOR
@ -919,13 +919,12 @@ draw_cells(ssize_t vao_idx, const WindowRenderData *srd, OSWindow *os_window, bo
}
Screen *screen = srd->screen;
CELL_BUFFERS;
bool inverted = screen_invert_colors(screen);
CellRenderData crd = {
.gl={.xstart = srd->xstart, .ystart = srd->ystart, .dx = srd->dx * x_ratio, .dy = srd->dy * y_ratio},
.x_ratio=x_ratio, .y_ratio=y_ratio
};
crd.gl.width = crd.gl.dx * screen->columns; crd.gl.height = crd.gl.dy * screen->lines;
cell_update_uniform_block(vao_idx, screen, uniform_buffer, &crd, &screen->cursor_render_info, inverted, os_window);
cell_update_uniform_block(vao_idx, screen, uniform_buffer, &crd, &screen->cursor_render_info, os_window);
bind_vao_uniform_buffer(vao_idx, uniform_buffer, cell_program_layouts[CELL_PROGRAM].render_data.index);
bind_vertex_array(vao_idx);