]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[list] Add a stable sort
authorCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 28 Nov 2009 20:08:09 +0000 (20:08 +0000)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 28 Nov 2009 20:08:09 +0000 (20:08 +0000)
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.

src/libply/ply-list.c
src/libply/ply-list.h
src/plugins/splash/script/script-lib-sprite.c
src/plugins/splash/space-flares/plugin.c

index 37b0de5d38a1d5d01a7d2f43fabe73c37c73f32e..b5806b1f451d8276069a2cfcf4630e345936a97c 100644 (file)
@@ -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)
 {
index 3f023188acb953e4cf076899600d363ec670e336..ce75b7cd24fd75405e7070af983b91fedf6ce33f 100644 (file)
@@ -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,
index d769b4c45b02a6fe4591f34ee0cce600ce2ce6e8..2f6fdcb877efe2e3fde051d22f3c57d6cf59a575 100644 (file)
@@ -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);
   
index 3a87161e3f01a6a92f3144c1cb28c006ca0688ec..c13beadf40678ccfd175986cb232e5098d062179 100644 (file)
@@ -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