*/
static void
scene_output_damage(struct wlr_scene_output *scene_output,
- const pixman_region32_t *region)
+ const pixman_region32_t *damage)
{
- wlr_damage_ring_add(&scene_output->damage_ring, region);
-
struct wlr_output *output = scene_output->output;
- enum wl_output_transform transform =
- wlr_output_transform_invert(scene_output->output->transform);
-
- int width = output->width;
- int height = output->height;
- if (transform & WL_OUTPUT_TRANSFORM_90) {
- width = output->height;
- height = output->width;
- }
- pixman_region32_t frame_damage;
- pixman_region32_init(&frame_damage);
- wlr_region_transform(&frame_damage, region, transform, width, height);
+ pixman_region32_t clipped;
+ pixman_region32_init(&clipped);
+ pixman_region32_intersect_rect(&clipped, damage, 0, 0, output->width, output->height);
- pixman_region32_union(&scene_output->pending_commit_damage,
- &scene_output->pending_commit_damage, &frame_damage);
- pixman_region32_intersect_rect(&scene_output->pending_commit_damage,
- &scene_output->pending_commit_damage, 0, 0, output->width, output->height);
- pixman_region32_fini(&frame_damage);
+ if (pixman_region32_not_empty(&clipped)) {
+ wlr_damage_ring_add(&scene_output->damage_ring, &clipped);
+ pixman_region32_union(&scene_output->pending_commit_damage,
+ &scene_output->pending_commit_damage, &clipped);
+ }
+
+ pixman_region32_fini(&clipped);
}
/*
pixman_region32_init_rect(®ion,
additional_damage.x, additional_damage.y,
additional_damage.width, additional_damage.height);
- /*
- * Region passed to scene_output_damage() should have the same
- * scale as the output buffer but have a different transform.
- */
- wlr_region_transform(®ion, ®ion, wlr_output->transform,
- wlr_output->width, wlr_output->height);
-
scene_output_damage(scene_output, ®ion);
pixman_region32_fini(®ion);
}