2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % L IIIII SSSSS TTTTT %
10 % LLLLL IIIII SSSSS T %
13 % MagickCore Image List Methods %
20 % Copyright 1999-2010 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;
95 assert((*images)->signature == MagickSignature);
96 p=GetLastImageInList(*images);
97 q=GetFirstImageInList(image);
100 q->scene=q->previous->scene+1;
104 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108 % C l o n e I m a g e L i s t %
112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
114 % CloneImageList() returns a duplicate of the image list.
116 % The format of the CloneImageList method is:
118 % Image *CloneImageList(const Image *images,ExceptionInfo *exception)
120 % A description of each parameter follows:
122 % o images: the image list.
124 % o exception: return any errors or warnings in this structure.
127 MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
136 if (images == (Image *) NULL)
137 return((Image *) NULL);
138 assert(images->signature == MagickSignature);
139 while (images->previous != (Image *) NULL)
140 images=images->previous;
141 image=(Image *) NULL;
142 for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
144 clone=CloneImage(images,0,0,MagickTrue,exception);
145 if (clone == (Image *) NULL)
147 if (image != (Image *) NULL)
148 image=DestroyImageList(image);
149 return((Image *) NULL);
151 if (image == (Image *) NULL)
165 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
169 % C l o n e I m a g e s %
173 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
175 % CloneImages() clones one or more images from an image sequence, using a
176 % comma separated list of image numbers or ranges.
178 % The numbers start at 0 for the first image in the list, while negative
179 % numbers refer to images starting counting from the end of the range. Images
180 % may be refered to multiple times to clone them multiple times. Images
181 % refered beyond the available number of images in list are ignored.
183 % Images referenced may be reversed, and results in a clone of those images
184 % also being made with a reversed order.
186 % The format of the CloneImages method is:
188 % Image *CloneImages(const Image *images,const char *scenes,
189 % ExceptionInfo *exception)
191 % A description of each parameter follows:
193 % o images: the image sequence.
195 % o scenes: This character string specifies which scenes to clone
196 % (e.g. 1,3-5,7-3,2).
198 % o exception: return any errors or warnings in this structure.
201 MagickExport Image *CloneImages(const Image *images,const char *scenes,
202 ExceptionInfo *exception)
225 assert(images != (const Image *) NULL);
226 assert(images->signature == MagickSignature);
227 assert(scenes != (char *) NULL);
228 if (images->debug != MagickFalse)
229 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
230 assert(exception != (ExceptionInfo *) NULL);
231 assert(exception->signature == MagickSignature);
232 clone_images=NewImageList();
233 images=GetFirstImageInList(images);
234 length=GetImageListLength(images);
235 for (p=(char *) scenes; *p != '\0';)
237 while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
239 first=strtol(p,&p,10);
241 first+=(long) length;
243 while (isspace((int) ((unsigned char) *p)) != 0)
247 last=strtol(p+1,&p,10);
251 for (step=first > last ? -1 : 1; first != (last+step); first+=step)
254 for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
258 image=CloneImage(next,0,0,MagickTrue,exception);
259 if (image == (Image *) NULL)
261 AppendImageToList(&clone_images,image);
267 return(GetFirstImageInList(clone_images));
271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
275 % D e l e t e I m a g e F r o m L i s t %
279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
281 % DeleteImageFromList() deletes an image from the list. List pointer
282 % is moved to the next image, if one is present. See RemoveImageFromList().
284 % The format of the DeleteImageFromList method is:
286 % DeleteImageFromList(Image **images)
288 % A description of each parameter follows:
290 % o images: the image list.
293 MagickExport void DeleteImageFromList(Image **images)
298 image=RemoveImageFromList(images);
299 if (image != (Image *) NULL)
300 (void) DestroyImage(image);
304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
308 % D e l e t e I m a g e s %
312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
314 % DeleteImages() deletes one or more images from an image sequence, using a
315 % comma separated list of image numbers or ranges.
317 % The numbers start at 0 for the first image, while negative numbers refer to
318 % images starting counting from the end of the range. Images may be refered to
319 % multiple times without problems. Image refered beyond the available number
320 % of images in list are ignored.
322 % If the referenced images are in the reverse order, that range will be
323 % completely ignored. Unlike CloneImages().
325 % The format of the DeleteImages method is:
327 % DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
329 % A description of each parameter follows:
331 % o images: the image sequence.
333 % o scenes: This character string specifies which scenes to delete
334 % (e.g. 1,3-5,-2-6,2).
336 % o exception: return any errors or warnings in this structure.
339 MagickExport void DeleteImages(Image **images,const char *scenes,
340 ExceptionInfo *exception)
361 assert(images != (Image **) NULL);
362 assert((*images)->signature == MagickSignature);
363 assert(scenes != (char *) NULL);
364 if ((*images)->debug != MagickFalse)
365 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
366 (*images)->filename);
367 assert(exception != (ExceptionInfo *) NULL);
368 assert(exception->signature == MagickSignature);
369 *images=GetFirstImageInList(*images);
370 length=GetImageListLength(*images);
371 delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
372 sizeof(*delete_list));
373 if (delete_list == (MagickBooleanType *) NULL)
375 (void) ThrowMagickException(exception,GetMagickModule(),
376 ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
380 for (i=0; i < (long) length; i++)
381 delete_list[i]=MagickFalse;
383 Note which images will be deleted, avoid duplicate deleted
385 for (p=(char *) scenes; *p != '\0';)
387 while ((isspace((int)*p) != 0) || (*p == ','))
389 first=strtol(p,&p,10);
391 first+=(long) length;
393 while (isspace((int) ((unsigned char) *p)) != 0)
397 last=strtol(p+1,&p,10);
403 for (i=first; i <= last; i++)
404 if ((i >= 0) && (i < (long) length))
405 delete_list[i]=MagickTrue;
408 Delete images marked for deletion, once only
411 for (i=0; i < (long) length; i++)
414 image=GetNextImageInList(image);
415 if (delete_list[i] != MagickFalse)
416 DeleteImageFromList(images);
419 (void) RelinquishMagickMemory(delete_list);
420 *images=GetFirstImageInList(*images);
424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
428 % D e s t r o y I m a g e L i s t %
432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
434 % DestroyImageList() destroys an image list.
436 % The format of the DestroyImageList method is:
438 % Image *DestroyImageList(Image *image)
440 % A description of each parameter follows:
442 % o image: the image sequence.
445 MagickExport Image *DestroyImageList(Image *images)
447 if (images == (Image *) NULL)
448 return((Image *) NULL);
449 assert(images->signature == MagickSignature);
450 if (images->debug != MagickFalse)
451 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
452 while (images != (Image *) NULL)
453 DeleteImageFromList(&images);
454 return((Image *) NULL);
458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
462 % G e t F i r s t I m a g e I n L i s t %
466 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
468 % GetFirstImageInList() returns a pointer to the first image in the list.
470 % The format of the GetFirstImageInList method is:
472 % Image *GetFirstImageInList(const Image *images)
474 % A description of each parameter follows:
476 % o images: the image list.
479 MagickExport Image *GetFirstImageInList(const Image *images)
484 if (images == (Image *) NULL)
485 return((Image *) NULL);
486 assert(images->signature == MagickSignature);
487 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
492 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
496 % G e t I m a g e F r o m L i s t %
500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
502 % GetImageFromList() returns an image at the specified offset from the list.
504 % The format of the GetImageFromList method is:
506 % Image *GetImageFromList(const Image *images,const long index)
508 % A description of each parameter follows:
510 % o images: the image list.
512 % o index: the position within the list.
515 MagickExport Image *GetImageFromList(const Image *images,const long index)
529 if (images == (Image *) NULL)
530 return((Image *) NULL);
531 assert(images->signature == MagickSignature);
532 if (images->debug != MagickFalse)
533 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
534 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
535 length=GetImageListLength(images);
536 for (offset=index; offset < 0; offset+=(long) length) ;
537 for (i=0; p != (Image *) NULL; p=p->next)
538 if (i++ == (long) (offset % length))
540 if (p == (Image *) NULL)
541 return((Image *) NULL);
546 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
550 % G e t I m a g e I n d e x I n L i s t %
554 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
556 % GetImageIndexInList() returns the offset in the list of the specified image.
558 % The format of the GetImageIndexInList method is:
560 % long GetImageIndexInList(const Image *images)
562 % A description of each parameter follows:
564 % o images: the image list.
567 MagickExport long GetImageIndexInList(const Image *images)
572 if (images == (const Image *) NULL)
574 assert(images->signature == MagickSignature);
575 for (i=0; images->previous != (Image *) NULL; i++)
576 images=images->previous;
581 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
585 % G e t I m a g e L i s t L e n g t h %
589 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
591 % GetImageListLength() returns the length of the list (the number of images in
594 % The format of the GetImageListLength method is:
596 % unsigned long GetImageListLength(const Image *images)
598 % A description of each parameter follows:
600 % o images: the image list.
603 MagickExport unsigned long GetImageListLength(const Image *images)
608 if (images == (Image *) NULL)
610 assert(images->signature == MagickSignature);
611 if (images->debug != MagickFalse)
612 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
613 while (images->previous != (Image *) NULL)
614 images=images->previous;
615 for (i=0; images != (Image *) NULL; images=images->next)
617 return((unsigned long) i);
621 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
625 % G e t L a s t I m a g e I n L i s t %
629 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
631 % GetLastImageInList() returns a pointer to the last image in the list.
633 % The format of the GetLastImageInList method is:
635 % Image *GetLastImageInList(const Image *images)
637 % A description of each parameter follows:
639 % o images: the image list.
642 MagickExport Image *GetLastImageInList(const Image *images)
647 if (images == (Image *) NULL)
648 return((Image *) NULL);
649 assert(images->signature == MagickSignature);
650 for (p=images; p->next != (Image *) NULL; p=p->next) ;
655 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
659 % G e t N e x t I m a g e I n L i s t %
663 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
665 % GetNextImageInList() returns the next image in the list.
667 % The format of the GetNextImageInList method is:
669 % Image *GetNextImageInList(const Image *images)
671 % A description of each parameter follows:
673 % o images: the image list.
676 MagickExport Image *GetNextImageInList(const Image *images)
678 if (images == (Image *) NULL)
679 return((Image *) NULL);
680 assert(images->signature == MagickSignature);
681 if (images->debug != MagickFalse)
682 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
683 return(images->next);
687 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
691 % G e t P r e v i o u s I m a g e I n L i s t %
695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
697 % GetPreviousImageInList() returns the previous image in the list.
699 % The format of the GetPreviousImageInList method is:
701 % Image *GetPreviousImageInList(const Image *images)
703 % A description of each parameter follows:
705 % o images: the image list.
708 MagickExport Image *GetPreviousImageInList(const Image *images)
710 if (images == (Image *) NULL)
711 return((Image *) NULL);
712 assert(images->signature == MagickSignature);
713 return(images->previous);
717 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
720 % I m a g e L i s t T o A r r a y %
724 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
726 % ImageListToArray() is a convenience method that converts an image list to
727 % a sequential array. For example,
729 % group = ImageListToArray(images, exception);
730 % while (i = 0; group[i] != (Image *) NULL; i++)
731 % printf("%s\n", group[i]->filename);
732 % printf("%d images\n", i);
733 % group = RelinquishMagickMemory(group);
735 % The format of the ImageListToArray method is:
737 % Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
739 % A description of each parameter follows:
741 % o image: the image list.
743 % o exception: return any errors or warnings in this structure.
746 MagickExport Image **ImageListToArray(const Image *images,
747 ExceptionInfo *exception)
755 if (images == (Image *) NULL)
756 return((Image **) NULL);
757 assert(images->signature == MagickSignature);
758 if (images->debug != MagickFalse)
759 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
760 group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
762 if (group == (Image **) NULL)
764 (void) ThrowMagickException(exception,GetMagickModule(),
765 ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename);
766 return((Image **) NULL);
768 images=GetFirstImageInList(images);
769 for (i=0; images != (Image *) NULL; images=images->next)
770 group[i++]=(Image *) images;
771 group[i]=(Image *) NULL;
776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
780 % I n s e r t I m a g e I n L i s t %
784 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
786 % InsertImageInList() inserts the second image or image list into the first
787 % image list immediatally after the image pointed to. The given image list
788 % pointer is unchanged unless previously empty.
790 % The format of the InsertImageInList method is:
792 % InsertImageInList(Image **images,Image *image)
794 % A description of each parameter follows:
796 % o images: the image list to insert into.
798 % o image: the image list to insert.
801 MagickExport void InsertImageInList(Image **images,Image *image)
806 assert(images != (Image **) NULL);
807 assert(image != (Image *) NULL);
808 assert(image->signature == MagickSignature);
809 if (image->debug != MagickFalse)
810 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
811 if ((*images) == (Image *) NULL)
813 assert((*images)->signature == MagickSignature);
814 split=SplitImageList(*images);
815 AppendImageToList(images,image);
816 AppendImageToList(images,split);
820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
824 % N e w I m a g e L i s t %
828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
830 % NewImageList() creates an empty image list.
832 % The format of the NewImageList method is:
834 % Image *NewImageList(void)
837 MagickExport Image *NewImageList(void)
839 return((Image *) NULL);
843 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
847 % P r e p e n d I m a g e T o L i s t %
851 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
853 % PrependImageToList() prepends the image to the beginning of the list.
855 % The format of the PrependImageToList method is:
857 % PrependImageToList(Image *images,Image *image)
859 % A description of each parameter follows:
861 % o images: the image list.
863 % o image: the image.
866 MagickExport void PrependImageToList(Image **images,Image *image)
868 AppendImageToList(&image,*images);
872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
876 % R e m o v e I m a g e F r o m L i s t %
880 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
882 % RemoveImageFromList() removes and returns the image pointed to.
884 % The given image list pointer is set to point to the next image in list
885 % if it exists, otherwise it is set to the previous image, or NULL if list
888 % The format of the RemoveImageFromList method is:
890 % Image *RemoveImageFromList(Image **images)
892 % A description of each parameter follows:
894 % o images: the image list.
897 MagickExport Image *RemoveImageFromList(Image **images)
902 assert(images != (Image **) NULL);
903 if ((*images) == (Image *) NULL)
904 return((Image *) NULL);
905 assert((*images)->signature == MagickSignature);
906 if ((*images)->debug != MagickFalse)
907 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
908 (*images)->filename);
910 if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
911 *images=(Image *) NULL;
914 if (p->previous != (Image *) NULL)
916 p->previous->next=p->next;
919 if (p->next != (Image *) NULL)
921 p->next->previous=p->previous;
924 p->previous=(Image *) NULL;
925 p->next=(Image *) NULL;
931 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
935 % R e m o v e F i r s t I m a g e F r o m L i s t %
939 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
941 % RemoveFirstImageFromList() removes and returns the first image in the list.
943 % If the given image list pointer pointed to the removed first image, it is
944 % set to the new first image of list, or NULL if list was emptied, otherwise
947 % The format of the RemoveFirstImageFromList method is:
949 % Image *RemoveFirstImageFromList(Image **images)
951 % A description of each parameter follows:
953 % o images: the image list.
956 MagickExport Image *RemoveFirstImageFromList(Image **images)
961 assert(images != (Image **) NULL);
962 if ((*images) == (Image *) NULL)
963 return((Image *) NULL);
964 assert((*images)->signature == MagickSignature);
965 if ((*images)->debug != MagickFalse)
966 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
967 (*images)->filename);
969 while (image->previous != (Image *) NULL)
970 image=image->previous;
971 if (image == *images)
972 *images=(*images)->next;
973 if (image->next != (Image *) NULL)
975 image->next->previous=(Image *) NULL;
976 image->next=(Image *) NULL;
982 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
986 % R e m o v e L a s t I m a g e F r o m L i s t %
990 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
992 % RemoveLastImageFromList() removes and returns the last image from the list.
994 % If the given image list pointer pointed to the removed last image, it is
995 % set to the new last image of list, or NULL if list was emptied, otherwise
998 % The format of the RemoveLastImageFromList method is:
1000 % Image *RemoveLastImageFromList(Image **images)
1002 % A description of each parameter follows:
1004 % o images: the image list.
1007 MagickExport Image *RemoveLastImageFromList(Image **images)
1012 assert(images != (Image **) NULL);
1013 if ((*images) == (Image *) NULL)
1014 return((Image *) NULL);
1015 assert((*images)->signature == MagickSignature);
1016 if ((*images)->debug != MagickFalse)
1017 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1018 (*images)->filename);
1020 while (image->next != (Image *) NULL)
1022 if (image == *images)
1023 *images=(*images)->previous;
1024 if (image->previous != (Image *) NULL)
1026 image->previous->next=(Image *) NULL;
1027 image->previous=(Image *) NULL;
1033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1037 % R e p l a c e I m a g e I n L i s t %
1041 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1043 % ReplaceImageInList() replaces an image in the list. Old image is destroyed.
1044 % The given image list pointer is set to point to the just inserted image.
1046 % The format of the ReplaceImageInList method is:
1048 % ReplaceImageInList(Image **images,Image *image)
1050 % A description of each parameter follows:
1052 % o images: the image list.
1054 % o image: the image.
1057 MagickExport void ReplaceImageInList(Image **images,Image *image)
1059 assert(images != (Image **) NULL);
1060 assert(image != (Image *) NULL);
1061 assert(image->signature == MagickSignature);
1062 if (image->debug != MagickFalse)
1063 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1064 if ((*images) == (Image *) NULL)
1066 assert((*images)->signature == MagickSignature);
1067 image->next=(*images)->next;
1068 if (image->next != (Image *) NULL)
1069 image->next->previous=image;
1070 image->previous=(*images)->previous;
1071 if (image->previous != (Image *) NULL)
1072 image->previous->next=image;
1073 (void) DestroyImage(*images);
1078 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1082 % R e v e r s e I m a g e L i s t %
1086 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1088 % ReverseImageList() reverses the order of an image list.
1089 % The list pointer is reset to that start of the re-ordered list.
1091 % The format of the ReverseImageList method is:
1093 % void ReverseImageList(Image **images)
1095 % A description of each parameter follows:
1097 % o images: the image list.
1100 MagickExport void ReverseImageList(Image **images)
1108 assert(images != (Image **) NULL);
1109 if ((*images) == (Image *) NULL)
1111 assert((*images)->signature == MagickSignature);
1112 if ((*images)->debug != MagickFalse)
1113 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1114 (*images)->filename);
1115 for (p=(*images); p->next != (Image *) NULL; p=p->next) ;
1117 for ( ; p != (Image *) NULL; p=p->next)
1120 p->next=p->previous;
1126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1130 % S p l i c e I m a g e I n t o L i s t %
1134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1136 % SpliceImageIntoList() removes 'length' images from the list and replaces
1137 % them with the specified splice. Removed images are returned.
1139 % The format of the SpliceImageIntoList method is:
1141 % SpliceImageIntoList(Image **images,const unsigned long,
1142 % const Image *splice)
1144 % A description of each parameter follows:
1146 % o images: the image list.
1148 % o length: the length of the image list to remove.
1150 % o splice: Replace the removed image list with this list.
1153 MagickExport Image *SpliceImageIntoList(Image **images,
1154 const unsigned long length,const Image *splice)
1160 register unsigned long
1163 assert(images != (Image **) NULL);
1164 assert(splice != (Image *) NULL);
1165 assert(splice->signature == MagickSignature);
1166 if ((*images) == (Image *) NULL)
1167 return((Image *) NULL);
1168 assert((*images)->signature == MagickSignature);
1169 if ((*images)->debug != MagickFalse)
1170 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1171 (*images)->filename);
1172 split=SplitImageList(*images);
1173 AppendImageToList(images,splice);
1174 image=(Image *) NULL;
1175 for (i=0; (i < length) && (split != (Image *) NULL); i++)
1176 AppendImageToList(&image,RemoveImageFromList(&split));
1177 AppendImageToList(images,split);
1182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1186 % S p l i t I m a g e L i s t %
1190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1192 % SplitImageList() splits an image into two lists, after given image
1193 % The list that was split off is returned, which may be empty.
1195 % The format of the SplitImageList method is:
1197 % Image *SplitImageList(Image *images)
1199 % A description of each parameter follows:
1201 % o images: the image list.
1204 MagickExport Image *SplitImageList(Image *images)
1206 if ((images == (Image *) NULL) || (images->next == (Image *) NULL))
1207 return((Image *) NULL);
1208 images=images->next;
1209 images->previous->next=(Image *) NULL;
1210 images->previous=(Image *) NULL;
1215 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1219 + S y n c I m a g e L i s t %
1223 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1225 % SyncImageList() synchronizes the scene numbers in an image list.
1227 % The format of the SyncImageList method is:
1229 % void SyncImageList(Image *images)
1231 % A description of each parameter follows:
1233 % o images: the image list.
1236 MagickExport void SyncImageList(Image *images)
1242 if (images == (Image *) NULL)
1244 assert(images->signature == MagickSignature);
1245 for (p=images; p != (Image *) NULL; p=p->next)
1247 for (q=p->next; q != (Image *) NULL; q=q->next)
1248 if (p->scene == q->scene)
1250 if (q != (Image *) NULL)
1253 if (p == (Image *) NULL)
1255 for (p=images->next; p != (Image *) NULL; p=p->next)
1256 p->scene=p->previous->scene+1;
1260 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1264 + S y n c N e x t I m a g e I n L i s t %
1268 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1270 % SyncNextImageInList() returns the next image in the list after the blob
1271 % referenced is synchronized with the current image.
1273 % The format of the SyncNextImageInList method is:
1275 % Image *SyncNextImageInList(const Image *images)
1277 % A description of each parameter follows:
1279 % o images: the image list.
1282 MagickExport Image *SyncNextImageInList(const Image *images)
1284 if (images == (Image *) NULL)
1285 return((Image *) NULL);
1286 assert(images->signature == MagickSignature);
1287 if (images->next == (Image *) NULL)
1288 return((Image *) NULL);
1289 if (images->blob != images->next->blob)
1291 DestroyBlob(images->next);
1292 images->next->blob=ReferenceBlob(images->blob);
1294 images->next->endian=images->endian;
1295 return(images->next);