summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Brej <cbrej@cs.man.ac.uk>2009-11-23 00:41:02 +0000
committerCharlie Brej <cbrej@cs.man.ac.uk>2009-11-23 00:41:02 +0000
commit230c0ee847410b9981290e5a2c6db330b00924e4 (patch)
tree9ae71063287b42c52c75e907109cf5899b901321
parentfea30a08abd2cb8c2632de697b5ecb90b70c9750 (diff)
[script] Use a region to collate all updated areas
Previously, refresh, each sprite would refresh its old area, then its new area. This, combined with situations where there are many sprites caused the area to be redrawn many times, each time redrawing each overlapping sprite data. Now we add all areas which need to be refreshed to a region and this makes a smaller set of rectangles to refresh, and these are not overlapping. Also uses the freeze display updates, which should work better now.
-rw-r--r--src/plugins/splash/script/script-lib-sprite.c82
1 files changed, 63 insertions, 19 deletions
diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c
index 89074489..d769b4c4 100644
--- a/src/plugins/splash/script/script-lib-sprite.c
+++ b/src/plugins/splash/script/script-lib-sprite.c
@@ -19,6 +19,7 @@
*
* Written by: Charlie Brej <cbrej@cs.man.ac.uk>
*/
+#include "config.h"
#include "ply-image.h"
#include "ply-utils.h"
#include "ply-logger.h"
@@ -334,20 +335,47 @@ script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state,
}
static int
-sprite_compare_z(void *data_a, void *data_b)
+sprite_compare_z (void *data_a, void *data_b)
{
sprite_t *sprite_a = data_a;
sprite_t *sprite_b = data_b;
return sprite_a->z - sprite_b->z;
}
-void script_lib_sprite_refresh (script_lib_sprite_data_t *data)
+static void
+region_add_area (ply_region_t *region,
+ long x,
+ long y,
+ unsigned long width,
+ unsigned long height)
+{
+ ply_rectangle_t rectangle;
+ rectangle.x = x;
+ rectangle.y = y;
+ rectangle.width = width;
+ rectangle.height = height;
+ ply_region_add_rectangle (region, &rectangle);
+}
+
+void
+script_lib_sprite_refresh (script_lib_sprite_data_t *data)
{
ply_list_node_t *node;
+ ply_region_t *region = ply_region_new ();
+ ply_list_t *rectable_list;
ply_list_sort (data->sprite_list, &sprite_compare_z);
node = ply_list_get_first_node (data->sprite_list);
+
+
+ if (data->full_refresh)
+ {
+ region_add_area (region, 0, 0,
+ ply_pixel_display_get_width (data->display),
+ ply_pixel_display_get_height (data->display));
+ data->full_refresh = false;
+ }
while (node)
{
@@ -357,11 +385,11 @@ void script_lib_sprite_refresh (script_lib_sprite_data_t *data)
if (sprite->remove_me)
{
if (sprite->image)
- draw_area (data,
- sprite->old_x,
- sprite->old_y,
- sprite->old_width,
- sprite->old_height);
+ region_add_area (region,
+ sprite->old_x,
+ sprite->old_y,
+ sprite->old_width,
+ sprite->old_height);
ply_list_remove_node (data->sprite_list, node);
script_obj_unref (sprite->image_obj);
free (sprite);
@@ -383,12 +411,17 @@ void script_lib_sprite_refresh (script_lib_sprite_data_t *data)
{
ply_rectangle_t size;
ply_pixel_buffer_get_size (sprite->image, &size);
- draw_area (data, sprite->x, sprite->y, size.width, size.height);
- draw_area (data,
- sprite->old_x,
- sprite->old_y,
- sprite->old_width,
- sprite->old_height);
+ region_add_area (region,
+ sprite->x,
+ sprite->y,
+ size.width,
+ size.height);
+ region_add_area (region,
+ sprite->old_x,
+ sprite->old_y,
+ sprite->old_width,
+ sprite->old_height);
+
sprite->old_x = sprite->x;
sprite->old_y = sprite->y;
sprite->old_z = sprite->z;
@@ -399,14 +432,25 @@ void script_lib_sprite_refresh (script_lib_sprite_data_t *data)
}
}
- if (data->full_refresh)
+ ply_pixel_display_pause_updates (data->display);
+ rectable_list = ply_region_get_rectangle_list (region);
+
+ for (node = ply_list_get_first_node (rectable_list);
+ node;
+ node = ply_list_get_next_node (rectable_list, node))
{
- draw_area (data, 0, 0,
- ply_pixel_display_get_width (data->display),
- ply_pixel_display_get_height (data->display));
- data->full_refresh = false;
- return;
+ ply_rectangle_t *rectangle = ply_list_node_get_data (node);
+
+
+ draw_area (data,
+ rectangle->x,
+ rectangle->y,
+ rectangle->width,
+ rectangle->height);
}
+ ply_pixel_display_unpause_updates (data->display);
+
+ ply_region_free (region);
}
void script_lib_sprite_destroy (script_lib_sprite_data_t *data)