]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[region] Allow rectangles to be sorted before being fed back
authorCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 28 Nov 2009 19:10:53 +0000 (19:10 +0000)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 28 Nov 2009 19:10:53 +0000 (19:10 +0000)
The renderers commit the rectangles derived from the region in a random order.
This gives some tearing as the screen is displayed with a random regions in
their new state. The change sorts the list of rectangles according to their Y
value to commit them from top to bottom. This gives fewer tear lines.

src/libply/ply-region.c
src/libply/ply-region.h
src/plugins/renderers/drm/plugin.c
src/plugins/renderers/frame-buffer/plugin.c
src/plugins/renderers/x11/plugin.c

index a235f3384998915922fd629c9ffa472b8549057e..2571330578507ea9794194eadb60ac32261dfd80 100644 (file)
@@ -452,6 +452,20 @@ ply_region_get_rectangle_list (ply_region_t *region)
   return region->rectangle_list;
 }
 
+static int
+rectangle_compare_y (void *element_a, void *element_b)
+{
+  ply_rectangle_t *rectangle_a = element_a;
+  ply_rectangle_t *rectangle_b = element_b;
+  return rectangle_a->y - rectangle_b->y;
+}
+
+ply_list_t *
+ply_region_get_sorted_rectangle_list (ply_region_t *region)
+{
+  return region->rectangle_list;
+}
+
 #ifdef PLY_REGION_ENABLE_TEST
 #include <stdio.h>
 
index ee6e992fac3d5ddd00ddba7add471b12ed269c42..f138b9b759929b25f1042f4160714f2fe1772d4e 100644 (file)
@@ -38,6 +38,7 @@ void ply_region_add_rectangle (ply_region_t    *region,
                                ply_rectangle_t *rectangle);
 void ply_region_clear (ply_region_t *region);
 ply_list_t *ply_region_get_rectangle_list (ply_region_t *region);
+ply_list_t *ply_region_get_sorted_rectangle_list (ply_region_t *region);
 
 bool ply_region_is_empty (ply_region_t *region);
 
index 1115b5cc793d9d890b0cdb30bea3846de56fa812..5e9c0485e525e31021027b470091271cbd8b8446 100644 (file)
@@ -966,7 +966,7 @@ flush_head (ply_renderer_backend_t *backend,
   ply_terminal_set_unbuffered_input (backend->terminal);
   pixel_buffer = head->pixel_buffer;
   updated_region = ply_pixel_buffer_get_updated_areas (pixel_buffer);
-  areas_to_flush = ply_region_get_rectangle_list (updated_region);
+  areas_to_flush = ply_region_get_sorted_rectangle_list (updated_region);
 
   map_address =
     backend->driver_interface->begin_flush (backend->driver,
index 80b5973d870b295aed9f4aefa2cbce797d9540c0..80f9d536402ce939c4b15424eecb501fdb0a1213 100644 (file)
@@ -551,7 +551,7 @@ flush_head (ply_renderer_backend_t *backend,
   ply_terminal_set_unbuffered_input (backend->terminal);
   pixel_buffer = head->pixel_buffer;
   updated_region = ply_pixel_buffer_get_updated_areas (pixel_buffer);
-  areas_to_flush = ply_region_get_rectangle_list (updated_region);
+  areas_to_flush = ply_region_get_sorted_rectangle_list (updated_region);
 
   node = ply_list_get_first_node (areas_to_flush);
   while (node != NULL)
index 3777b6c2669f264a2eb3844fe635485f35237dac..53961dcabbaed466813d1beea4a0777acc4a1c65 100644 (file)
@@ -357,7 +357,7 @@ flush_head (ply_renderer_backend_t *backend,
 
   pixel_buffer = head->pixel_buffer;
   updated_region = ply_pixel_buffer_get_updated_areas (pixel_buffer);
-  areas_to_flush = ply_region_get_rectangle_list (updated_region);
+  areas_to_flush = ply_region_get_sorted_rectangle_list (updated_region);
 
   cr = gdk_cairo_create (head->pixmap);