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.
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)
{
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,
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);
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