2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % L IIIII SSSSS TTTTT %
10 % LLLLL IIIII SSSSS T %
13 % MagickCore Image List Methods %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 #include "magick/studio.h"
44 #include "magick/blob.h"
45 #include "magick/blob-private.h"
46 #include "magick/exception.h"
47 #include "magick/exception-private.h"
48 #include "magick/list.h"
49 #include "magick/memory_.h"
50 #include "magick/string_.h"
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 % A p p e n d I m a g e T o L i s t %
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63 % AppendImageToList() appends the second image list to the end of the first
64 % list. The given image list pointer is left unchanged, unless it was empty.
66 % The format of the AppendImageToList method is:
68 % AppendImageToList(Image *images,const Image *image)
70 % A description of each parameter follows:
72 % o images: the image list to be appended to.
74 % o image: the appended image or image list.
77 MagickExport void AppendImageToList(Image **images,const Image *image)
83 assert(images != (Image **) NULL);
84 if (image == (Image *) NULL)
86 assert(image->signature == MagickSignature);
87 if (image->debug != MagickFalse)
88 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
89 if ((*images) == (Image *) NULL)
91 *images=(Image *) image;
94 assert((*images)->signature == MagickSignature);
95 p=GetLastImageInList(*images);
96 q=GetFirstImageInList(image);
102 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106 % C l o n e I m a g e L i s t %
110 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
112 % CloneImageList() returns a duplicate of the image list.
114 % The format of the CloneImageList method is:
116 % Image *CloneImageList(const Image *images,ExceptionInfo *exception)
118 % A description of each parameter follows:
120 % o images: the image list.
122 % o exception: return any errors or warnings in this structure.
125 MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
134 if (images == (Image *) NULL)
135 return((Image *) NULL);
136 assert(images->signature == MagickSignature);
137 while (images->previous != (Image *) NULL)
138 images=images->previous;
139 image=(Image *) NULL;
140 for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
142 clone=CloneImage(images,0,0,MagickTrue,exception);
143 if (clone == (Image *) NULL)
145 if (image != (Image *) NULL)
146 image=DestroyImageList(image);
147 return((Image *) NULL);
149 if (image == (Image *) NULL)
163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
167 % C l o n e I m a g e s %
171 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
173 % CloneImages() clones one or more images from an image sequence, using a
174 % comma separated list of image numbers or ranges.
176 % The numbers start at 0 for the first image in the list, while negative
177 % numbers refer to images starting counting from the end of the range. Images
178 % may be refered to multiple times to clone them multiple times. Images
179 % refered beyond the available number of images in list are ignored.
181 % Images referenced may be reversed, and results in a clone of those images
182 % also being made with a reversed order.
184 % The format of the CloneImages method is:
186 % Image *CloneImages(const Image *images,const char *scenes,
187 % ExceptionInfo *exception)
189 % A description of each parameter follows:
191 % o images: the image sequence.
193 % o scenes: This character string specifies which scenes to clone
194 % (e.g. 1,3-5,7-3,2).
196 % o exception: return any errors or warnings in this structure.
199 MagickExport Image *CloneImages(const Image *images,const char *scenes,
200 ExceptionInfo *exception)
223 assert(images != (const Image *) NULL);
224 assert(images->signature == MagickSignature);
225 assert(scenes != (char *) NULL);
226 if (images->debug != MagickFalse)
227 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
228 assert(exception != (ExceptionInfo *) NULL);
229 assert(exception->signature == MagickSignature);
230 clone_images=NewImageList();
231 images=GetFirstImageInList(images);
232 length=GetImageListLength(images);
233 for (p=(char *) scenes; *p != '\0';)
235 while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
237 first=strtol(p,&p,10);
239 first+=(long) length;
241 while (isspace((int) ((unsigned char) *p)) != 0)
245 last=strtol(p+1,&p,10);
249 for (step=first > last ? -1 : 1; first != (last+step); first+=step)
252 for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
254 if (i == (ssize_t) first)
256 image=CloneImage(next,0,0,MagickTrue,exception);
257 if (image == (Image *) NULL)
259 AppendImageToList(&clone_images,image);
265 return(GetFirstImageInList(clone_images));
269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
273 % D e l e t e I m a g e F r o m L i s t %
277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
279 % DeleteImageFromList() duplicates an image from the list. List pointer
280 % is moved to the next image, if one is present. See RemoveImageFromList().
282 % The format of the DeleteImageFromList method is:
284 % DeleteImageFromList(Image **images)
286 % A description of each parameter follows:
288 % o images: the image list.
291 MagickExport void DeleteImageFromList(Image **images)
296 image=RemoveImageFromList(images);
297 if (image != (Image *) NULL)
298 (void) DestroyImage(image);
302 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
306 % D e l e t e I m a g e s %
310 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
312 % DeleteImages() duplicates one or more images from an image sequence, using a
313 % comma separated list of image numbers or ranges.
315 % The numbers start at 0 for the first image, while negative numbers refer to
316 % images starting counting from the end of the range. Images may be refered to
317 % multiple times without problems. Image refered beyond the available number
318 % of images in list are ignored.
320 % If the referenced images are in the reverse order, that range will be
321 % completely ignored, unlike CloneImages().
323 % The format of the DeleteImages method is:
325 % DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
327 % A description of each parameter follows:
329 % o images: the image sequence.
331 % o scenes: This character string specifies which scenes to duplicate
332 % (e.g. 1,3-5,-2-6,2).
334 % o exception: return any errors or warnings in this structure.
337 MagickExport void DeleteImages(Image **images,const char *scenes,
338 ExceptionInfo *exception)
359 assert(images != (Image **) NULL);
360 assert((*images)->signature == MagickSignature);
361 assert(scenes != (char *) NULL);
362 if ((*images)->debug != MagickFalse)
363 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
364 (*images)->filename);
365 assert(exception != (ExceptionInfo *) NULL);
366 assert(exception->signature == MagickSignature);
367 *images=GetFirstImageInList(*images);
368 length=GetImageListLength(*images);
369 duplicate_list=(MagickBooleanType *) AcquireQuantumMemory(length,
370 sizeof(*duplicate_list));
371 if (duplicate_list == (MagickBooleanType *) NULL)
373 (void) ThrowMagickException(exception,GetMagickModule(),
374 ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
378 for (i=0; i < (ssize_t) length; i++)
379 duplicate_list[i]=MagickFalse;
381 Note which images will be duplicated, avoid duplicate duplicated
383 for (p=(char *) scenes; *p != '\0';)
385 while ((isspace((int)*p) != 0) || (*p == ','))
387 first=strtol(p,&p,10);
389 first+=(long) length;
391 while (isspace((int) ((unsigned char) *p)) != 0)
395 last=strtol(p+1,&p,10);
401 for (i=(ssize_t) first; i <= (ssize_t) last; i++)
402 if ((i >= 0) && (i < (ssize_t) length))
403 duplicate_list[i]=MagickTrue;
406 Delete images marked for deletion, once only
409 for (i=0; i < (ssize_t) length; i++)
412 image=GetNextImageInList(image);
413 if (duplicate_list[i] != MagickFalse)
414 DeleteImageFromList(images);
417 (void) RelinquishMagickMemory(duplicate_list);
418 *images=GetFirstImageInList(*images);
422 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
426 % D e s t r o y I m a g e L i s t %
430 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
432 % DestroyImageList() destroys an image list.
434 % The format of the DestroyImageList method is:
436 % Image *DestroyImageList(Image *image)
438 % A description of each parameter follows:
440 % o image: the image sequence.
443 MagickExport Image *DestroyImageList(Image *images)
445 if (images == (Image *) NULL)
446 return((Image *) NULL);
447 assert(images->signature == MagickSignature);
448 if (images->debug != MagickFalse)
449 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
450 while (images != (Image *) NULL)
451 DeleteImageFromList(&images);
452 return((Image *) NULL);
456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
460 % D u p l i c a t e I m a g e s %
464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
466 % DuplicateImages() duplicates one or more images from an image sequence,
467 % using a count and a comma separated list of image numbers or ranges.
469 % The numbers start at 0 for the first image, while negative numbers refer to
470 % images starting counting from the end of the range. Images may be refered to
471 % multiple times without problems. Image refered beyond the available number
472 % of images in list are ignored.
474 % If the referenced images are in the reverse order, that range will be
475 % completely ignored, unlike CloneImages().
477 % The format of the DuplicateImages method is:
479 % Image *DuplicateImages(Image *images,const char *scenes,
480 % ExceptionInfo *exception)
482 % A description of each parameter follows:
484 % o images: the image sequence.
486 % o scenes: This character string specifies the count and which scenes to
487 % duplicate (e.g. 2,1,3-5,-2-6,2).
489 % o exception: return any errors or warnings in this structure.
492 MagickExport Image *DuplicateImages(Image *images,const char *scenes,
493 ExceptionInfo *exception)
508 assert(images != (Image *) NULL);
509 assert(images->signature == MagickSignature);
510 assert(scenes != (char *) NULL);
511 if (images->debug != MagickFalse)
512 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
513 assert(exception != (ExceptionInfo *) NULL);
514 assert(exception->signature == MagickSignature);
516 while ((isspace((int)*p) != 0) || (*p == ','))
518 count=(ssize_t) strtol(p,&p,10);
519 duplicate_images=NewImageList();
522 clone_images=CloneImages(images,p,exception);
523 AppendImageToList(&duplicate_images,clone_images);
525 if (duplicate_images == (Image *) NULL)
526 duplicate_images=CloneImages(images,"0",exception);
527 return(duplicate_images);
531 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
535 % G e t F i r s t I m a g e I n L i s t %
539 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
541 % GetFirstImageInList() returns a pointer to the first image in the list.
543 % The format of the GetFirstImageInList method is:
545 % Image *GetFirstImageInList(const Image *images)
547 % A description of each parameter follows:
549 % o images: the image list.
552 MagickExport Image *GetFirstImageInList(const Image *images)
557 if (images == (Image *) NULL)
558 return((Image *) NULL);
559 assert(images->signature == MagickSignature);
560 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
565 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
569 % G e t I m a g e F r o m L i s t %
573 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
575 % GetImageFromList() returns an image at the specified offset from the list.
577 % The format of the GetImageFromList method is:
579 % Image *GetImageFromList(const Image *images,const ssize_t index)
581 % A description of each parameter follows:
583 % o images: the image list.
585 % o index: the position within the list.
588 MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
602 if (images == (Image *) NULL)
603 return((Image *) NULL);
604 assert(images->signature == MagickSignature);
605 if (images->debug != MagickFalse)
606 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
607 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
608 length=GetImageListLength(images);
609 for (offset=index; offset < 0; offset+=(ssize_t) length) ;
610 for (i=0; p != (Image *) NULL; p=p->next)
611 if (i++ == (ssize_t) (offset % length))
613 if (p == (Image *) NULL)
614 return((Image *) NULL);
619 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
623 % G e t I m a g e I n d e x I n L i s t %
627 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
629 % GetImageIndexInList() returns the offset in the list of the specified image.
631 % The format of the GetImageIndexInList method is:
633 % ssize_t GetImageIndexInList(const Image *images)
635 % A description of each parameter follows:
637 % o images: the image list.
640 MagickExport ssize_t GetImageIndexInList(const Image *images)
645 if (images == (const Image *) NULL)
647 assert(images->signature == MagickSignature);
648 for (i=0; images->previous != (Image *) NULL; i++)
649 images=images->previous;
654 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
658 % G e t I m a g e L i s t L e n g t h %
662 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
664 % GetImageListLength() returns the length of the list (the number of images in
667 % The format of the GetImageListLength method is:
669 % size_t GetImageListLength(const Image *images)
671 % A description of each parameter follows:
673 % o images: the image list.
676 MagickExport size_t GetImageListLength(const Image *images)
681 if (images == (Image *) NULL)
683 assert(images->signature == MagickSignature);
684 if (images->debug != MagickFalse)
685 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
686 while (images->previous != (Image *) NULL)
687 images=images->previous;
688 for (i=0; images != (Image *) NULL; images=images->next)
694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
698 % G e t L a s t I m a g e I n L i s t %
702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
704 % GetLastImageInList() returns a pointer to the last image in the list.
706 % The format of the GetLastImageInList method is:
708 % Image *GetLastImageInList(const Image *images)
710 % A description of each parameter follows:
712 % o images: the image list.
715 MagickExport Image *GetLastImageInList(const Image *images)
720 if (images == (Image *) NULL)
721 return((Image *) NULL);
722 assert(images->signature == MagickSignature);
723 for (p=images; p->next != (Image *) NULL; p=p->next) ;
728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
732 % G e t N e x t I m a g e I n L i s t %
736 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
738 % GetNextImageInList() returns the next image in the list.
740 % The format of the GetNextImageInList method is:
742 % Image *GetNextImageInList(const Image *images)
744 % A description of each parameter follows:
746 % o images: the image list.
749 MagickExport Image *GetNextImageInList(const Image *images)
751 if (images == (Image *) NULL)
752 return((Image *) NULL);
753 assert(images->signature == MagickSignature);
754 if (images->debug != MagickFalse)
755 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
756 return(images->next);
760 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
764 % G e t P r e v i o u s I m a g e I n L i s t %
768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
770 % GetPreviousImageInList() returns the previous image in the list.
772 % The format of the GetPreviousImageInList method is:
774 % Image *GetPreviousImageInList(const Image *images)
776 % A description of each parameter follows:
778 % o images: the image list.
781 MagickExport Image *GetPreviousImageInList(const Image *images)
783 if (images == (Image *) NULL)
784 return((Image *) NULL);
785 assert(images->signature == MagickSignature);
786 return(images->previous);
790 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
793 % I m a g e L i s t T o A r r a y %
797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
799 % ImageListToArray() is a convenience method that converts an image list to
800 % a sequential array. For example,
802 % group = ImageListToArray(images, exception);
803 % while (i = 0; group[i] != (Image *) NULL; i++)
804 % printf("%s\n", group[i]->filename);
805 % printf("%d images\n", i);
806 % group = RelinquishMagickMemory(group);
808 % The format of the ImageListToArray method is:
810 % Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
812 % A description of each parameter follows:
814 % o image: the image list.
816 % o exception: return any errors or warnings in this structure.
819 MagickExport Image **ImageListToArray(const Image *images,
820 ExceptionInfo *exception)
828 if (images == (Image *) NULL)
829 return((Image **) NULL);
830 assert(images->signature == MagickSignature);
831 if (images->debug != MagickFalse)
832 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
833 group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
835 if (group == (Image **) NULL)
837 (void) ThrowMagickException(exception,GetMagickModule(),
838 ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename);
839 return((Image **) NULL);
841 images=GetFirstImageInList(images);
842 for (i=0; images != (Image *) NULL; images=images->next)
843 group[i++]=(Image *) images;
844 group[i]=(Image *) NULL;
849 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
853 % I n s e r t I m a g e I n L i s t %
857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
859 % InsertImageInList() inserts the second image or image list into the first
860 % image list immediately after the image pointed to. The given image list
861 % pointer is unchanged unless previously empty.
863 % The format of the InsertImageInList method is:
865 % InsertImageInList(Image **images,Image *image)
867 % A description of each parameter follows:
869 % o images: the image list to insert into.
871 % o image: the image list to insert.
874 MagickExport void InsertImageInList(Image **images,Image *image)
879 assert(images != (Image **) NULL);
880 assert(image != (Image *) NULL);
881 assert(image->signature == MagickSignature);
882 if (image->debug != MagickFalse)
883 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
884 if ((*images) == (Image *) NULL)
886 assert((*images)->signature == MagickSignature);
887 split=SplitImageList(*images);
888 AppendImageToList(images,image);
889 AppendImageToList(images,split);
893 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
897 % N e w I m a g e L i s t %
901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903 % NewImageList() creates an empty image list.
905 % The format of the NewImageList method is:
907 % Image *NewImageList(void)
910 MagickExport Image *NewImageList(void)
912 return((Image *) NULL);
916 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
920 + P a g e I n d e x I m a g e L i s t %
924 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
926 % PageIndexImageList() synchronizes the page_index and page_total values
929 % These values are used by InterpretImageProperties() to set %p and %n
930 % percent escapes. The value is preserved, even if the image is later removed
931 % from the list using RemoveFirstImageFromList() for individual image
934 % The format of the PageIndexImageList method is:
936 % void PageIndexImageList(Image *images)
938 % A description of each parameter follows:
940 % o images: the image list.
943 MagickExport void PageIndexImageList(Image *images)
948 if (images == (Image *) NULL)
950 assert(images->signature == MagickSignature);
951 if (images->debug != MagickFalse)
952 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
954 /* find start for image counting */
955 while (images->previous != (Image *) NULL)
956 images=images->previous;
958 /* count up images - find end */
960 while (images->next != (Image *) NULL)
961 images=images->next, n++;
963 /* set page_index and page_total attributes */
965 for (; images != (Image *) NULL; images=images->previous)
966 images->page_index=p--, images->page_total=(size_t) n;
970 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
974 % P r e p e n d I m a g e T o L i s t %
978 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
980 % PrependImageToList() prepends the image to the beginning of the list.
982 % The format of the PrependImageToList method is:
984 % PrependImageToList(Image *images,Image *image)
986 % A description of each parameter follows:
988 % o images: the image list.
990 % o image: the image.
993 MagickExport void PrependImageToList(Image **images,Image *image)
995 AppendImageToList(&image,*images);
999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1003 % R e m o v e I m a g e F r o m L i s t %
1007 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1009 % RemoveImageFromList() removes and returns the image pointed to.
1011 % The given image list pointer is set to point to the next image in list
1012 % if it exists, otherwise it is set to the previous image, or NULL if list
1015 % The format of the RemoveImageFromList method is:
1017 % Image *RemoveImageFromList(Image **images)
1019 % A description of each parameter follows:
1021 % o images: the image list.
1024 MagickExport Image *RemoveImageFromList(Image **images)
1029 assert(images != (Image **) NULL);
1030 if ((*images) == (Image *) NULL)
1031 return((Image *) NULL);
1032 assert((*images)->signature == MagickSignature);
1033 if ((*images)->debug != MagickFalse)
1034 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1035 (*images)->filename);
1037 if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
1038 *images=(Image *) NULL;
1041 if (p->previous != (Image *) NULL)
1043 p->previous->next=p->next;
1044 *images=p->previous;
1046 if (p->next != (Image *) NULL)
1048 p->next->previous=p->previous;
1051 p->previous=(Image *) NULL;
1052 p->next=(Image *) NULL;
1058 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1062 % R e m o v e F i r s t I m a g e F r o m L i s t %
1066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1068 % RemoveFirstImageFromList() removes and returns the first image in the list.
1070 % If the given image list pointer pointed to the removed first image, it is
1071 % set to the new first image of list, or NULL if list was emptied, otherwise
1074 % The format of the RemoveFirstImageFromList method is:
1076 % Image *RemoveFirstImageFromList(Image **images)
1078 % A description of each parameter follows:
1080 % o images: the image list.
1083 MagickExport Image *RemoveFirstImageFromList(Image **images)
1088 assert(images != (Image **) NULL);
1089 if ((*images) == (Image *) NULL)
1090 return((Image *) NULL);
1091 assert((*images)->signature == MagickSignature);
1092 if ((*images)->debug != MagickFalse)
1093 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1094 (*images)->filename);
1096 while (image->previous != (Image *) NULL)
1097 image=image->previous;
1098 if (image == *images)
1099 *images=(*images)->next;
1100 if (image->next != (Image *) NULL)
1102 image->next->previous=(Image *) NULL;
1103 image->next=(Image *) NULL;
1109 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1113 % R e m o v e L a s t I m a g e F r o m L i s t %
1117 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1119 % RemoveLastImageFromList() removes and returns the last image from the list.
1121 % If the given image list pointer pointed to the removed last image, it is
1122 % set to the new last image of list, or NULL if list was emptied, otherwise
1125 % The format of the RemoveLastImageFromList method is:
1127 % Image *RemoveLastImageFromList(Image **images)
1129 % A description of each parameter follows:
1131 % o images: the image list.
1134 MagickExport Image *RemoveLastImageFromList(Image **images)
1139 assert(images != (Image **) NULL);
1140 if ((*images) == (Image *) NULL)
1141 return((Image *) NULL);
1142 assert((*images)->signature == MagickSignature);
1143 if ((*images)->debug != MagickFalse)
1144 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1145 (*images)->filename);
1147 while (image->next != (Image *) NULL)
1149 if (image == *images)
1150 *images=(*images)->previous;
1151 if (image->previous != (Image *) NULL)
1153 image->previous->next=(Image *) NULL;
1154 image->previous=(Image *) NULL;
1160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1164 % R e p l a c e I m a g e I n L i s t %
1168 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1170 % ReplaceImageInList() replaces an image in the list. Old image is destroyed.
1171 % The given image list pointer is set to point to the just inserted image.
1173 % The format of the ReplaceImageInList method is:
1175 % ReplaceImageInList(Image **images,Image *image)
1177 % A description of each parameter follows:
1179 % o images: the image list.
1181 % o image: the image.
1184 MagickExport void ReplaceImageInList(Image **images,Image *image)
1186 assert(images != (Image **) NULL);
1187 assert(image != (Image *) NULL);
1188 assert(image->signature == MagickSignature);
1189 if (image->debug != MagickFalse)
1190 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1191 if ((*images) == (Image *) NULL)
1193 assert((*images)->signature == MagickSignature);
1194 for ( ; image->next != (Image *) NULL; image=image->next) ;
1195 image->next=(*images)->next;
1196 if (image->next != (Image *) NULL)
1197 image->next->previous=image;
1198 for ( ; image->previous != (Image *) NULL; image=image->previous) ;
1199 image->previous=(*images)->previous;
1200 if (image->previous != (Image *) NULL)
1201 image->previous->next=image;
1202 (void) DestroyImage(*images);
1207 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1211 % R e v e r s e I m a g e L i s t %
1215 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1217 % ReverseImageList() reverses the order of an image list.
1218 % The list pointer is reset to that start of the re-ordered list.
1220 % The format of the ReverseImageList method is:
1222 % void ReverseImageList(Image **images)
1224 % A description of each parameter follows:
1226 % o images: the image list.
1229 MagickExport void ReverseImageList(Image **images)
1237 assert(images != (Image **) NULL);
1238 if ((*images) == (Image *) NULL)
1240 assert((*images)->signature == MagickSignature);
1241 if ((*images)->debug != MagickFalse)
1242 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1243 (*images)->filename);
1244 for (p=(*images); p->next != (Image *) NULL; p=p->next) ;
1246 for ( ; p != (Image *) NULL; p=p->next)
1249 p->next=p->previous;
1255 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1259 % S p l i c e I m a g e I n t o L i s t %
1263 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1265 % SpliceImageIntoList() removes 'length' images from the list and replaces
1266 % them with the specified splice. Removed images are returned.
1268 % The format of the SpliceImageIntoList method is:
1270 % SpliceImageIntoList(Image **images,const size_t,
1271 % const Image *splice)
1273 % A description of each parameter follows:
1275 % o images: the image list.
1277 % o length: the length of the image list to remove.
1279 % o splice: Replace the removed image list with this list.
1282 MagickExport Image *SpliceImageIntoList(Image **images,
1283 const size_t length,const Image *splice)
1292 assert(images != (Image **) NULL);
1293 assert(splice != (Image *) NULL);
1294 assert(splice->signature == MagickSignature);
1295 if ((*images) == (Image *) NULL)
1296 return((Image *) NULL);
1297 assert((*images)->signature == MagickSignature);
1298 if ((*images)->debug != MagickFalse)
1299 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1300 (*images)->filename);
1301 split=SplitImageList(*images);
1302 AppendImageToList(images,splice);
1303 image=(Image *) NULL;
1304 for (i=0; (i < length) && (split != (Image *) NULL); i++)
1305 AppendImageToList(&image,RemoveImageFromList(&split));
1306 AppendImageToList(images,split);
1311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1315 % S p l i t I m a g e L i s t %
1319 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1321 % SplitImageList() splits an image into two lists, after given image
1322 % The list that was split off is returned, which may be empty.
1324 % The format of the SplitImageList method is:
1326 % Image *SplitImageList(Image *images)
1328 % A description of each parameter follows:
1330 % o images: the image list.
1333 MagickExport Image *SplitImageList(Image *images)
1335 if ((images == (Image *) NULL) || (images->next == (Image *) NULL))
1336 return((Image *) NULL);
1337 images=images->next;
1338 images->previous->next=(Image *) NULL;
1339 images->previous=(Image *) NULL;
1344 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1348 + S y n c I m a g e L i s t %
1352 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1354 % SyncImageList() synchronizes the scene numbers in an image list.
1356 % The format of the SyncImageList method is:
1358 % void SyncImageList(Image *images)
1360 % A description of each parameter follows:
1362 % o images: the image list.
1365 MagickExport void SyncImageList(Image *images)
1371 if (images == (Image *) NULL)
1373 assert(images->signature == MagickSignature);
1374 for (p=images; p != (Image *) NULL; p=p->next)
1376 for (q=p->next; q != (Image *) NULL; q=q->next)
1377 if (p->scene == q->scene)
1379 if (q != (Image *) NULL)
1382 if (p == (Image *) NULL)
1384 for (p=images->next; p != (Image *) NULL; p=p->next)
1385 p->scene=p->previous->scene+1;
1389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1393 + S y n c N e x t I m a g e I n L i s t %
1397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1399 % SyncNextImageInList() returns the next image in the list after the blob
1400 % referenced is synchronized with the current image.
1402 % The format of the SyncNextImageInList method is:
1404 % Image *SyncNextImageInList(const Image *images)
1406 % A description of each parameter follows:
1408 % o images: the image list.
1411 MagickExport Image *SyncNextImageInList(const Image *images)
1413 if (images == (Image *) NULL)
1414 return((Image *) NULL);
1415 assert(images->signature == MagickSignature);
1416 if (images->next == (Image *) NULL)
1417 return((Image *) NULL);
1418 if (images->blob != images->next->blob)
1420 DestroyBlob(images->next);
1421 images->next->blob=ReferenceBlob(images->blob);
1423 images->next->compression=images->compression;
1424 images->next->endian=images->endian;
1425 return(images->next);