@@ -550,13 +550,14 @@ viewport_for_cells(const CellRenderData *crd) {
550550}
551551
552552static void
553- draw_cells_simple (ssize_t vao_idx , Screen * screen , const CellRenderData * crd ) {
553+ draw_cells_simple (ssize_t vao_idx , Screen * screen , const CellRenderData * crd , bool is_semi_transparent ) {
554554 bind_program (CELL_PROGRAM );
555555 glDrawArraysInstanced (GL_TRIANGLE_FAN , 0 , 4 , screen -> lines * screen -> columns );
556556 if (screen -> grman -> count ) {
557557 glEnable (GL_BLEND );
558- BLEND_ONTO_OPAQUE ;
559- draw_graphics (GRAPHICS_PROGRAM , vao_idx , screen -> grman -> render_data , 0 , screen -> grman -> count , viewport_for_cells (crd ));
558+ int program = GRAPHICS_PROGRAM ;
559+ if (is_semi_transparent ) { BLEND_PREMULT ; program = GRAPHICS_PREMULT_PROGRAM ; } else { BLEND_ONTO_OPAQUE ; }
560+ draw_graphics (program , vao_idx , screen -> grman -> render_data , 0 , screen -> grman -> count , viewport_for_cells (crd ));
560561 glDisable (GL_BLEND );
561562 }
562563}
@@ -955,14 +956,13 @@ draw_cells(ssize_t vao_idx, const ScreenRenderData *srd, OSWindow *os_window, bo
955956 scale_rendered_graphic (screen -> grman -> render_data + i , srd -> xstart , srd -> ystart , crd .x_ratio , crd .y_ratio );
956957 }
957958 }
959+ has_underlying_image |= screen -> grman -> num_of_below_refs > 0 || screen -> grman -> num_of_negative_refs > 0 ;
958960 if (os_window -> is_semi_transparent ) {
959- if (screen -> grman -> count || has_underlying_image ) draw_cells_interleaved_premult (
960- vao_idx , screen , os_window , & crd , wl );
961- else draw_cells_simple (vao_idx , screen , & crd );
961+ if (has_underlying_image ) draw_cells_interleaved_premult (vao_idx , screen , os_window , & crd , wl );
962+ else draw_cells_simple (vao_idx , screen , & crd , os_window -> is_semi_transparent );
962963 } else {
963- if (screen -> grman -> num_of_negative_refs || screen -> grman -> num_of_below_refs || has_underlying_image ) draw_cells_interleaved (
964- vao_idx , screen , os_window , & crd , wl );
965- else draw_cells_simple (vao_idx , screen , & crd );
964+ if (has_underlying_image ) draw_cells_interleaved (vao_idx , screen , os_window , & crd , wl );
965+ else draw_cells_simple (vao_idx , screen , & crd , os_window -> is_semi_transparent );
966966 }
967967
968968 if (screen -> start_visual_bell_at ) {
0 commit comments