Commit 3d7aaa622 for imagemagick.org

commit 3d7aaa6223680621fa7a171f17162f19c1fdd98d
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Tue Oct 13 19:03:01 2026 -0400

    support ShuffleImages()

diff --git a/MagickCore/list.c b/MagickCore/list.c
index d81690c88..095797650 100644
--- a/MagickCore/list.c
+++ b/MagickCore/list.c
@@ -1328,6 +1328,93 @@ MagickExport void ReverseImageList(Image **images)
 }

 /*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                            %
+%                                                                            %
+%                                                                            %
+%   S h u f f l e I m a g e s                                                %
+%                                                                            %
+%                                                                            %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ShuffleImages() randomly shuffles the positions of the images in an image
+%  list.
+%
+%  The format of the ShuffleImages method is:
+%
+%      Image *ShuffleImages(Image **images,ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o images: the image list.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *ShuffleImages(Image **images,ExceptionInfo *exception)
+{
+  Image
+    **image_array;
+
+  RandomInfo
+    *random_info;
+
+  register ssize_t
+    i;
+
+  size_t
+    number_images;
+
+  /*
+    Ensure the image list is valid.
+  */
+  assert(images != (Image **) NULL);
+  if (*images == (Image *) NULL)
+    return((Image *) NULL);
+  if ((*images)->previous != (Image *) NULL)
+    *images=GetFirstImageInList(*images);
+  number_images=GetImageListLength(*images);
+  if (number_images <= 1)
+    return(*images);
+  /*
+    Convert the image list into a temporary array of image pointers.
+  */
+  image_array=ImageListToArray(*images,exception);
+  if (image_array == (Image **) NULL)
+    return((Image *) NULL);
+  /*
+    Shuffle the array using the Fisher-Yates algorithm.
+  */
+  random_info=AcquireRandomInfo();
+  for (i=(ssize_t) number_images-1; i > 0; i--)
+  {
+    ssize_t
+      j;
+
+    Image *temp = image_array[i];
+    j=(ssize_t) (GetPseudoRandomValue(random_info)*(i+1));
+    if (j > i)
+      j=i;
+    image_array[i]=image_array[j];
+    image_array[j]=temp;
+  }
+  random_info=DestroyRandomInfo(random_info);
+  /*
+    Re-link the image list based on the shuffled order.
+  */
+  *images=image_array[0];
+  (*images)->previous=(Image *) NULL;
+  for (i=0; i < (ssize_t) number_images; i++)
+  {
+    image_array[i]->next=(i+1 < (ssize_t) number_images) ? image_array[i+1] :
+      (Image *) NULL;
+    image_array[i]->previous=(i > 0) ? image_array[i-1] : (Image *) NULL;
+  }
+  image_array=(Image **) RelinquishMagickMemory(image_array);
+  return(*images);
+}
+
+/*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
 %                                                                             %