From: Charlie Brej Date: Sat, 28 Nov 2009 20:08:09 +0000 (+0000) Subject: [list] Add a stable sort X-Git-Tag: 0.8.0~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49cb1714cf1c5c6f76cc520e1afe50411470cb3a;p=thirdparty%2Fplymouth.git [list] Add a stable sort Stable sort sorts but does not change the order of elements which are equal. This is important in the sprite based plugins where if the level of the sprites is equal because it may be unimportant which is on top, changing the order between frames looks bad. --- diff --git a/src/libply/ply-list.c b/src/libply/ply-list.c index 37b0de5d..b5806b1f 100644 --- a/src/libply/ply-list.c +++ b/src/libply/ply-list.c @@ -327,6 +327,31 @@ ply_list_sort (ply_list_t *list, compare); } +void +ply_list_sort_stable (ply_list_t *list, + ply_list_compare_func_t *compare) +{ + ply_list_node_t *top_node; + ply_list_node_t *cur_node; + + top_node = ply_list_get_first_node (list); + if (top_node == NULL) return; + top_node = top_node->next; + + while (top_node) + { + cur_node = top_node->previous; + while (cur_node && compare(cur_node->data, cur_node->next->data) > 0) + { + ply_list_sort_swap (&cur_node->data, + &cur_node->next->data); + cur_node = cur_node->previous; + } + top_node = top_node->next; + } + +} + void * ply_list_node_get_data (ply_list_node_t *node) { diff --git a/src/libply/ply-list.h b/src/libply/ply-list.h index 3f023188..ce75b7cd 100644 --- a/src/libply/ply-list.h +++ b/src/libply/ply-list.h @@ -44,8 +44,10 @@ void ply_list_remove_data (ply_list_t *list, void ply_list_remove_node (ply_list_t *list, ply_list_node_t *node); void ply_list_remove_all_nodes (ply_list_t *list); -void ply_list_sort (ply_list_t *list, - ply_list_compare_func_t *compare); +void ply_list_sort (ply_list_t *list, + ply_list_compare_func_t *compare); +void ply_list_sort_stable (ply_list_t *list, + ply_list_compare_func_t *compare); ply_list_node_t *ply_list_get_first_node (ply_list_t *list); ply_list_node_t *ply_list_get_last_node (ply_list_t *list); ply_list_node_t *ply_list_get_next_node (ply_list_t *list, diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c index d769b4c4..2f6fdcb8 100644 --- a/src/plugins/splash/script/script-lib-sprite.c +++ b/src/plugins/splash/script/script-lib-sprite.c @@ -364,7 +364,7 @@ script_lib_sprite_refresh (script_lib_sprite_data_t *data) ply_region_t *region = ply_region_new (); ply_list_t *rectable_list; - ply_list_sort (data->sprite_list, &sprite_compare_z); + ply_list_sort_stable (data->sprite_list, &sprite_compare_z); node = ply_list_get_first_node (data->sprite_list); diff --git a/src/plugins/splash/space-flares/plugin.c b/src/plugins/splash/space-flares/plugin.c index 3a87161e..c13beadf 100644 --- a/src/plugins/splash/space-flares/plugin.c +++ b/src/plugins/splash/space-flares/plugin.c @@ -910,7 +910,7 @@ satellite_move (view_t *view, sprite_t* sprite, double time) static void sprite_list_sort (view_t *view) { - ply_list_sort (view->sprites, &sprite_compare_z); + ply_list_sort_stable (view->sprites, &sprite_compare_z); } static void