From 230c0ee847410b9981290e5a2c6db330b00924e4 Mon Sep 17 00:00:00 2001 From: Charlie Brej Date: Mon, 23 Nov 2009 00:41:02 +0000 Subject: [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. --- src/plugins/splash/script/script-lib-sprite.c | 82 ++++++++++++++++++++------- 1 file 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 */ +#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) -- cgit v1.2.3