Clip out pixels covered by opaque surfaces during repaint
This commit is contained in:
+21
-1
@@ -492,7 +492,7 @@ wlsc_output_repaint(struct wlsc_output *output)
|
||||
struct wlsc_compositor *ec = output->compositor;
|
||||
struct wlsc_surface *es;
|
||||
struct wlsc_input_device *eid;
|
||||
pixman_region32_t new_damage, total_damage;
|
||||
pixman_region32_t new_damage, total_damage, repaint;
|
||||
|
||||
output->prepare_render(output);
|
||||
|
||||
@@ -520,6 +520,18 @@ wlsc_output_repaint(struct wlsc_output *output)
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
wlsc_surface_draw(es, output, &total_damage);
|
||||
} else {
|
||||
wl_list_for_each(es, &ec->surface_list, link) {
|
||||
if (es->visual != &ec->compositor.rgb_visual)
|
||||
continue;
|
||||
|
||||
pixman_region32_init_rect(&repaint,
|
||||
es->x, es->y,
|
||||
es->width, es->height);
|
||||
wlsc_surface_draw(es, output, &total_damage);
|
||||
pixman_region32_subtract(&total_damage,
|
||||
&total_damage, &repaint);
|
||||
}
|
||||
|
||||
if (output->background)
|
||||
wlsc_surface_draw(output->background,
|
||||
output, &total_damage);
|
||||
@@ -531,6 +543,14 @@ wlsc_output_repaint(struct wlsc_output *output)
|
||||
ec->switcher->current == es)
|
||||
continue;
|
||||
|
||||
if (es->visual == &ec->compositor.rgb_visual) {
|
||||
pixman_region32_union_rect(&total_damage,
|
||||
&total_damage,
|
||||
es->x, es->y,
|
||||
es->width, es->height);
|
||||
continue;
|
||||
}
|
||||
|
||||
wlsc_surface_draw(es, output, &total_damage);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user