@ -486,6 +486,9 @@ static void render_output(struct roots_output *output) {
goto renderer_end ;
goto renderer_end ;
}
}
// Uncomment this line to debug damage tracking
//wlr_renderer_clear(renderer, (float[]){1, 1, 0, 0});
int nrects ;
int nrects ;
pixman_box32_t * rects = pixman_region32_rectangles ( & damage , & nrects ) ;
pixman_box32_t * rects = pixman_region32_rectangles ( & damage , & nrects ) ;
for ( int i = 0 ; i < nrects ; + + i ) {
for ( int i = 0 ; i < nrects ; + + i ) {
@ -667,32 +670,23 @@ static void damage_from_surface(struct wlr_surface *surface,
surface_intersect_output ( surface , output - > desktop - > layout ,
surface_intersect_output ( surface , output - > desktop - > layout ,
wlr_output , lx , ly , rotation , & box ) ;
wlr_output , lx , ly , rotation , & box ) ;
if ( rotation = = 0 ) {
int center_x = box . x + box . width / 2 ;
pixman_region32_t damage ;
int center_y = box . y + box . height / 2 ;
pixman_region32_init ( & damage ) ;
pixman_region32_copy ( & damage , & surface - > current - > surface_damage ) ;
pixman_region32_t damage ;
wlr_region_scale ( & damage , & damage , wlr_output - > scale ) ;
pixman_region32_init ( & damage ) ;
if ( ceil ( wlr_output - > scale ) > surface - > current - > scale ) {
pixman_region32_copy ( & damage , & surface - > current - > surface_damage ) ;
// When scaling up a surface, it'll become blurry so we need to
wlr_region_scale ( & damage , & damage , wlr_output - > scale ) ;
// expand the damage region
if ( ceil ( wlr_output - > scale ) > surface - > current - > scale ) {
wlr_region_expand ( & damage , & damage ,
// When scaling up a surface, it'll become blurry so we need to
ceil ( wlr_output - > scale ) - surface - > current - > scale ) ;
// expand the damage region
}
wlr_region_expand ( & damage , & damage ,
pixman_region32_translate ( & damage , box . x , box . y ) ;
ceil ( wlr_output - > scale ) - surface - > current - > scale ) ;
wlr_output_damage_add ( output - > damage , & damage ) ;
}
pixman_region32_fini ( & damage ) ;
pixman_region32_translate ( & damage , box . x , box . y ) ;
} else {
wlr_region_rotated_bounds ( & damage , & damage , rotation , center_x , center_y ) ;
pixman_box32_t * extents =
wlr_output_damage_add ( output - > damage , & damage ) ;
pixman_region32_extents ( & surface - > current - > surface_damage ) ;
pixman_region32_fini ( & damage ) ;
struct wlr_box damage_box = {
. x = box . x + extents - > x1 * wlr_output - > scale ,
. y = box . y + extents - > y1 * wlr_output - > scale ,
. width = ( extents - > x2 - extents - > x1 ) * wlr_output - > scale ,
. height = ( extents - > y2 - extents - > y1 ) * wlr_output - > scale ,
} ;
wlr_box_rotated_bounds ( & damage_box , rotation , & damage_box ) ;
wlr_output_damage_add_box ( output - > damage , & damage_box ) ;
}
}
}
void output_damage_from_view ( struct roots_output * output ,
void output_damage_from_view ( struct roots_output * output ,