[mutter] wayland: Fix damage of infinite regions



commit dbca3337b2ce81cb13c58adb9c10d258cdc79f67
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Mar 20 15:09:37 2015 +0800

    wayland: Fix damage of infinite regions
    
    To avoid integer overflow when scaling "infinite" regions (0, 0)
    (INT32_MAX, INT32_MAX), intersect with the surface rect before scaling,
    instead of intersecting with the buffer rect afterwards.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=746510

 src/wayland/meta-wayland-surface.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)
---
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 5dfa8fb..d6da2dc 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -121,24 +121,30 @@ static void
 surface_process_damage (MetaWaylandSurface *surface,
                         cairo_region_t *region)
 {
+  unsigned int buffer_width;
+  unsigned int buffer_height;
+  cairo_rectangle_int_t surface_rect;
   cairo_region_t *scaled_region;
-  cairo_rectangle_int_t buffer_rect;
   int i, n_rectangles;
 
   if (!surface->buffer)
     return;
 
-  buffer_rect.x = 0;
-  buffer_rect.y = 0;
-  buffer_rect.width = cogl_texture_get_width (surface->buffer->texture);
-  buffer_rect.height = cogl_texture_get_height (surface->buffer->texture);
+  /* Intersect the damage region with the surface region before scaling in
+   * order to avoid integer overflow when scaling a damage region is too large
+   * (for example INT32_MAX which mesa passes). */
+  buffer_width = cogl_texture_get_width (surface->buffer->texture);
+  buffer_height = cogl_texture_get_height (surface->buffer->texture);
+  surface_rect = (cairo_rectangle_int_t) {
+    .width = buffer_width / surface->scale,
+    .height = buffer_height / surface->scale,
+  };
+  cairo_region_intersect_rectangle (region, &surface_rect);
 
   /* The damage region must be in the same coordinate space as the buffer,
    * i.e. scaled with surface->scale. */
   scaled_region = meta_region_scale (region, surface->scale);
 
-  cairo_region_intersect_rectangle (scaled_region, &buffer_rect);
-
   /* First update the buffer. */
   meta_wayland_buffer_process_damage (surface->buffer, scaled_region);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]