mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 22:28:24 +02:00
Fix SPECIAL stage in interleaved rendering
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
|
||||
#ifdef NEEDS_BACKROUND
|
||||
in vec3 background;
|
||||
#ifdef TRANSPARENT
|
||||
#if defined(TRANSPARENT) || defined(SPECIAL)
|
||||
in float bg_alpha;
|
||||
#endif
|
||||
#endif
|
||||
@@ -63,7 +63,7 @@ vec4 calculate_foreground() {
|
||||
|
||||
void main() {
|
||||
#if defined(BACKGROUND) || defined(SPECIAL)
|
||||
#ifdef TRANSPARENT
|
||||
#if defined(TRANSPARENT) || defined(SPECIAL)
|
||||
final_color = vec4(background.rgb * bg_alpha, bg_alpha);
|
||||
#else
|
||||
final_color = vec4(background.rgb, 1.0f);
|
||||
|
||||
@@ -41,7 +41,7 @@ const uvec2 cell_pos_map[] = uvec2[4](
|
||||
|
||||
#ifdef NEEDS_BACKROUND
|
||||
out vec3 background;
|
||||
#ifdef TRANSPARENT
|
||||
#if defined(TRANSPARENT) || defined(SPECIAL)
|
||||
out float bg_alpha;
|
||||
#endif
|
||||
#endif
|
||||
@@ -173,18 +173,24 @@ void main() {
|
||||
|
||||
#if defined(BACKGROUND)
|
||||
background = bg;
|
||||
#else
|
||||
// Selection and cursor
|
||||
bg = choose_color(is_selected, color_to_vec(highlight_bg), bg);
|
||||
background = choose_color(cursor, color_to_vec(cursor_color), bg);
|
||||
#endif
|
||||
|
||||
#ifdef TRANSPARENT
|
||||
#if defined(TRANSPARENT) && !defined(SPECIAL)
|
||||
// If the background color is default, set its opacity to background_opacity, otherwise it should be opaque
|
||||
bg_alpha = step(0.5, float(colors[bg_index] & BYTE_MASK));
|
||||
bg_alpha = bg_alpha + (1.0f - bg_alpha) * background_opacity;
|
||||
#endif
|
||||
|
||||
#if defined(SPECIAL) || defined(SIMPLE)
|
||||
// Selection and cursor
|
||||
bg = choose_color(is_selected, color_to_vec(highlight_bg), bg);
|
||||
background = choose_color(cursor, color_to_vec(cursor_color), bg);
|
||||
#ifdef SPECIAL
|
||||
// bg_alpha should be 1 if cursor/selection otherwise 0
|
||||
bg_alpha = mix(0.0, 1.0, step(0.5, is_selected + cursor));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
// }}}
|
||||
|
||||
|
||||
@@ -279,8 +279,8 @@ cell_prepare_to_render(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, GLfloa
|
||||
|
||||
static void
|
||||
draw_graphics(int program, ssize_t vao_idx, ssize_t gvao_idx, ImageRenderData *data, GLuint start, GLuint count) {
|
||||
bind_vertex_array(gvao_idx);
|
||||
bind_program(program);
|
||||
bind_vertex_array(gvao_idx);
|
||||
static bool graphics_constants_set = false;
|
||||
if (!graphics_constants_set) {
|
||||
glUniform1i(glGetUniformLocation(program_id(GRAPHICS_PROGRAM), "image"), GRAPHICS_UNIT);
|
||||
@@ -332,6 +332,7 @@ draw_cells_interleaved(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, OSWind
|
||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // blending of pre-multiplied colors
|
||||
|
||||
if (screen->grman->num_of_negative_refs) draw_graphics(GRAPHICS_PREMULT_PROGRAM, vao_idx, gvao_idx, screen->grman->render_data, 0, screen->grman->num_of_negative_refs);
|
||||
|
||||
bind_program(CELL_SPECIAL_PROGRAM);
|
||||
@@ -341,6 +342,7 @@ draw_cells_interleaved(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, OSWind
|
||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns);
|
||||
|
||||
if (screen->grman->num_of_positive_refs) draw_graphics(GRAPHICS_PREMULT_PROGRAM, vao_idx, gvao_idx, screen->grman->render_data, screen->grman->num_of_negative_refs, screen->grman->num_of_positive_refs);
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user