2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % L IIIII SSSSS TTTTT %
10 % LLLLL IIIII SSSSS T %
13 % MagickCore Image List Methods %
20 % Copyright 1999-2009 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);
99 SyncImageList(*images);
103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107 % C l o n e I m a g e L i s t %
111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113 % CloneImageList() returns a duplicate of the image list.
115 % The format of the CloneImageList method is:
117 % Image *CloneImageList(const Image *images,ExceptionInfo *exception)
119 % A description of each parameter follows:
121 % o images: the image list.
123 % o exception: return any errors or warnings in this structure.
126 MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
135 if (images == (Image *) NULL)
136 return((Image *) NULL);
137 assert(images->signature == MagickSignature);
138 while (images->previous != (Image *) NULL)
139 images=images->previous;
140 image=(Image *) NULL;
141 for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
143 clone=CloneImage(images,0,0,MagickTrue,exception);
144 if (clone == (Image *) NULL)
146 if (image != (Image *) NULL)
147 image=DestroyImageList(image);
148 return((Image *) NULL);
150 if (image == (Image *) NULL)
164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
168 % C l o n e I m a g e s %
172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
174 % CloneImages() clones one or more images from an image sequence, using a
175 % comma separated list of image numbers or ranges.
177 % The numbers start at 0 for the first image in the list, while negative
178 % numbers refer to images starting counting from the end of the range. Images
179 % may be refered to multiple times to clone them multiple times. Images
180 % refered beyond the available number of images in list are ignored.
182 % Images referenced may be reversed, and results in a clone of those images
183 % also being made with a reversed order.
185 % The format of the CloneImages method is:
187 % Image *CloneImages(const Image *images,const char *scenes,
188 % ExceptionInfo *exception)
190 % A description of each parameter follows:
192 % o images: the image sequence.
194 % o scenes: This character string specifies which scenes to clone
195 % (e.g. 1,3-5,7-3,2).
197 % o exception: return any errors or warnings in this structure.
200 MagickExport Image *CloneImages(const Image *images,const char *scenes,
201 ExceptionInfo *exception)
224 assert(images != (const Image *) NULL);
225 assert(images->signature == MagickSignature);
226 assert(scenes != (char *) NULL);
227 if (images->debug != MagickFalse)
228 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
229 assert(exception != (ExceptionInfo *) NULL);
230 assert(exception->signature == MagickSignature);
231 clone_images=NewImageList();
232 images=GetFirstImageInList(images);
233 length=GetImageListLength(images);
234 for (p=(char *) scenes; *p != '\0';)
236 while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
238 first=strtol(p,&p,10);
240 first+=(long) length;
242 while (isspace((int) ((unsigned char) *p)) != 0)
246 last=strtol(p+1,&p,10);
250 for (step=first > last ? -1 : 1; first != (last+step); first+=step)
253 for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
257 image=CloneImage(next,0,0,MagickTrue,exception);
258 if (image == (Image *) NULL)
260 AppendImageToList(&clone_images,image);
266 return(GetFirstImageInList(clone_images));
270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 % D e l e t e I m a g e F r o m L i s t %
278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 % DeleteImageFromList() deletes an image from the list. List pointer
281 % is moved to the next image, if one is present. See RemoveImageFromList().
283 % The format of the DeleteImageFromList method is:
285 % DeleteImageFromList(Image **images)
287 % A description of each parameter follows:
289 % o images: the image list.
292 MagickExport void DeleteImageFromList(Image **images)
297 image=RemoveImageFromList(images);
298 if (image != (Image *) NULL)
299 (void) DestroyImage(image);
303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
307 % D e l e t e I m a g e s %
311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
313 % DeleteImages() deletes one or more images from an image sequence, using a
314 % comma separated list of image numbers or ranges.
316 % The numbers start at 0 for the first image, while negative numbers refer to
317 % images starting counting from the end of the range. Images may be refered to
318 % multiple times without problems. Image refered beyond the available number
319 % of images in list are ignored.
321 % If the referenced images are in the reverse order, that range will be
322 % completely ignored. Unlike CloneImages().
324 % The format of the DeleteImages method is:
326 % DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
328 % A description of each parameter follows:
330 % o images: the image sequence.
332 % o scenes: This character string specifies which scenes to delete
333 % (e.g. 1,3-5,-2-6,2).
335 % o exception: return any errors or warnings in this structure.
338 MagickExport void DeleteImages(Image **images,const char *scenes,
339 ExceptionInfo *exception)
360 assert(images != (Image **) NULL);
361 assert((*images)->signature == MagickSignature);
362 assert(scenes != (char *) NULL);
363 if ((*images)->debug != MagickFalse)
364 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
365 (*images)->filename);
366 assert(exception != (ExceptionInfo *) NULL);
367 assert(exception->signature == MagickSignature);
368 *images=GetFirstImageInList(*images);
369 length=GetImageListLength(*images);
370 delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
371 sizeof(*delete_list));
372 if (delete_list == (MagickBooleanType *) NULL)
374 (void) ThrowMagickException(exception,GetMagickModule(),
375 ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
379 for (i=0; i < (long) length; i++)
380 delete_list[i]=MagickFalse;
382 Note which images will be deleted, avoid duplicate deleted
384 for (p=(char *) scenes; *p != '\0';)
386 while ((isspace((int)*p) != 0) || (*p == ','))
388 first=strtol(p,&p,10);
390 first+=(long) length;
392 while (isspace((int) ((unsigned char) *p)) != 0)
396 last=strtol(p+1,&p,10);
402 for (i=first; i <= last; i++)
403 if ((i >= 0) && (i < (long) length))
404 delete_list[i]=MagickTrue;
407 Delete images marked for deletion, once only
410 for (i=0; i < (long) length; i++)
413 image=GetNextImageInList(image);
414 if (delete_list[i] != MagickFalse)
415 DeleteImageFromList(images);
418 (void) RelinquishMagickMemory(delete_list);
419 *images=GetFirstImageInList(*images);
423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
427 % D e s t r o y I m a g e L i s t %
431 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
433 % DestroyImageList() destroys an image list.
435 % The format of the DestroyImageList method is:
437 % Image *DestroyImageList(Image *image)
439 % A description of each parameter follows:
441 % o image: the image sequence.
444 MagickExport Image *DestroyImageList(Image *images)
446 if (images == (Image *) NULL)
447 return((Image *) NULL);
448 assert(images->signature == MagickSignature);
449 if (images->debug != MagickFalse)
450 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
451 while (images != (Image *) NULL)
452 DeleteImageFromList(&images);
453 return((Image *) NULL);
457 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
461 % G e t F i r s t I m a g e I n L i s t %
465 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
467 % GetFirstImageInList() returns a pointer to the first image in the list.
469 % The format of the GetFirstImageInList method is:
471 % Image *GetFirstImageInList(const Image *images)
473 % A description of each parameter follows:
475 % o images: the image list.
478 MagickExport Image *GetFirstImageInList(const Image *images)
483 if (images == (Image *) NULL)
484 return((Image *) NULL);
485 assert(images->signature == MagickSignature);
486 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
491 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
495 % G e t I m a g e F r o m L i s t %
499 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
501 % GetImageFromList() returns an image at the specified offset from the list.
503 % The format of the GetImageFromList method is:
505 % Image *GetImageFromList(const Image *images,const long index)
507 % A description of each parameter follows:
509 % o images: the image list.
511 % o index: the position within the list.
514 MagickExport Image *GetImageFromList(const Image *images,const long index)
528 if (images == (Image *) NULL)
529 return((Image *) NULL);
530 assert(images->signature == MagickSignature);
531 if (images->debug != MagickFalse)
532 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
533 for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
534 length=GetImageListLength(images);
535 for (offset=index; offset < 0; offset+=(long) length) ;
536 for (i=0; p != (Image *) NULL; p=p->next)
537 if (i++ == (long) (offset % length))
539 if (p == (Image *) NULL)
540 return((Image *) NULL);
545 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
549 % G e t I m a g e I n d e x I n L i s t %
553 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
555 % GetImageIndexInList() returns the offset in the list of the specified image.
557 % The format of the GetImageIndexInList method is:
559 % long GetImageIndexInList(const Image *images)
561 % A description of each parameter follows:
563 % o images: the image list.
566 MagickExport long GetImageIndexInList(const Image *images)
571 if (images == (const Image *) NULL)
573 assert(images->signature == MagickSignature);
574 for (i=0; images->previous != (Image *) NULL; i++)
575 images=images->previous;
580 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
584 % G e t I m a g e L i s t L e n g t h %
588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
590 % GetImageListLength() returns the length of the list (the number of images in
593 % The format of the GetImageListLength method is:
595 % unsigned long GetImageListLength(const Image *images)
597 % A description of each parameter follows:
599 % o images: the image list.
602 MagickExport unsigned long GetImageListLength(const Image *images)
607 if (images == (Image *) NULL)
609 assert(images->signature == MagickSignature);
610 if (images->debug != MagickFalse)
611 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
612 while (images->previous != (Image *) NULL)
613 images=images->previous;
614 for (i=0; images != (Image *) NULL; images=images->next)
616 return((unsigned long) i);
620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
624 % G e t L a s t I m a g e I n L i s t %
628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
630 % GetLastImageInList() returns a pointer to the last image in the list.
632 % The format of the GetLastImageInList method is:
634 % Image *GetLastImageInList(const Image *images)
636 % A description of each parameter follows:
638 % o images: the image list.
641 MagickExport Image *GetLastImageInList(const Image *images)
646 if (images == (Image *) NULL)
647 return((Image *) NULL);
648 assert(images->signature == MagickSignature);
649 for (p=images; p->next != (Image *) NULL; p=p->next) ;
654 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
658 % G e t N e x t I m a g e I n L i s t %
662 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
664 % GetNextImageInList() returns the next image in the list.
666 % The format of the GetNextImageInList method is:
668 % Image *GetNextImageInList(const Image *images)
670 % A description of each parameter follows:
672 % o images: the image list.
675 MagickExport Image *GetNextImageInList(const Image *images)
677 if (images == (Image *) NULL)
678 return((Image *) NULL);
679 assert(images->signature == MagickSignature);
680 if (images->debug != MagickFalse)
681 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
682 return(images->next);
686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
690 % G e t P r e v i o u s I m a g e I n L i s t %
694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
696 % GetPreviousImageInList() returns the previous image in the list.
698 % The format of the GetPreviousImageInList method is:
700 % Image *GetPreviousImageInList(const Image *images)
702 % A description of each parameter follows:
704 % o images: the image list.
707 MagickExport Image *GetPreviousImageInList(const Image *images)
709 if (images == (Image *) NULL)
710 return((Image *) NULL);
711 assert(images->signature == MagickSignature);
712 return(images->previous);
716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
719 % I m a g e L i s t T o A r r a y %
723 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
725 % ImageListToArray() is a convenience method that converts an image list to
726 % a sequential array. For example,
728 % group = ImageListToArray(images, exception);
729 % while (i = 0; group[i] != (Image *) NULL; i++)
730 % printf("%s\n", group[i]->filename);
731 % printf("%d images\n", i);
732 % group = RelinquishMagickMemory(group);
734 % The format of the ImageListToArray method is:
736 % Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
738 % A description of each parameter follows:
740 % o image: the image list.
742 % o exception: return any errors or warnings in this structure.
745 MagickExport Image **ImageListToArray(const Image *images,
746 ExceptionInfo *exception)
754 if (images == (Image *) NULL)
755 return((Image **) NULL);
756 assert(images->signature == MagickSignature);
757 if (images->debug != MagickFalse)
758 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
759 group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
761 if (group == (Image **) NULL)
763 (void) ThrowMagickException(exception,GetMagickModule(),
764 ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename);
765 return((Image **) NULL);
767 images=GetFirstImageInList(images);
768 for (i=0; images != (Image *) NULL; images=images->next)
769 group[i++]=(Image *) images;
770 group[i]=(Image *) NULL;
775 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
779 % I n s e r t I m a g e I n L i s t %
783 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
785 % InsertImageInList() inserts the second image or image list into the first
786 % image list immediatally after the image pointed to. The given image list
787 % pointer is unchanged unless previously empty.
789 % The format of the InsertImageInList method is:
791 % InsertImageInList(Image **images,Image *image)
793 % A description of each parameter follows:
795 % o images: the image list to insert into.
797 % o image: the image list to insert.
800 MagickExport void InsertImageInList(Image **images,Image *image)
805 assert(images != (Image **) NULL);
806 assert(image != (Image *) NULL);
807 assert(image->signature == MagickSignature);
808 if (image->debug != MagickFalse)
809 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
810 if ((*images) == (Image *) NULL)
812 assert((*images)->signature == MagickSignature);
813 split=SplitImageList(*images);
814 AppendImageToList(images,image);
815 AppendImageToList(images,split);
819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
823 % N e w I m a g e L i s t %
827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
829 % NewImageList() creates an empty image list.
831 % The format of the NewImageList method is:
833 % Image *NewImageList(void)
836 MagickExport Image *NewImageList(void)
838 return((Image *) NULL);
842 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
846 % P r e p e n d I m a g e T o L i s t %
850 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
852 % PrependImageToList() prepends the image to the beginning of the list.
854 % The format of the PrependImageToList method is:
856 % PrependImageToList(Image *images,Image *image)
858 % A description of each parameter follows:
860 % o images: the image list.
862 % o image: the image.
865 MagickExport void PrependImageToList(Image **images,Image *image)
867 AppendImageToList(&image,*images);
871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
875 % R e m o v e I m a g e F r o m L i s t %
879 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
881 % RemoveImageFromList() removes and returns the image pointed to.
883 % The given image list pointer is set to point to the next image in list
884 % if it exists, otherwise it is set to the previous image, or NULL if list
887 % The format of the RemoveImageFromList method is:
889 % Image *RemoveImageFromList(Image **images)
891 % A description of each parameter follows:
893 % o images: the image list.
896 MagickExport Image *RemoveImageFromList(Image **images)
901 assert(images != (Image **) NULL);
902 if ((*images) == (Image *) NULL)
903 return((Image *) NULL);
904 assert((*images)->signature == MagickSignature);
905 if ((*images)->debug != MagickFalse)
906 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
907 (*images)->filename);
909 if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
910 *images=(Image *) NULL;
913 if (p->previous != (Image *) NULL)
915 p->previous->next=p->next;
918 if (p->next != (Image *) NULL)
920 p->next->previous=p->previous;
923 p->previous=(Image *) NULL;
924 p->next=(Image *) NULL;
930 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
934 % R e m o v e F i r s t I m a g e F r o m L i s t %
938 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
940 % RemoveFirstImageFromList() removes and returns the first image in the list.
942 % If the given image list pointer pointed to the removed first image, it is
943 % set to the new first image of list, or NULL if list was emptied, otherwise
946 % The format of the RemoveFirstImageFromList method is:
948 % Image *RemoveFirstImageFromList(Image **images)
950 % A description of each parameter follows:
952 % o images: the image list.
955 MagickExport Image *RemoveFirstImageFromList(Image **images)
960 assert(images != (Image **) NULL);
961 if ((*images) == (Image *) NULL)
962 return((Image *) NULL);
963 assert((*images)->signature == MagickSignature);
964 if ((*images)->debug != MagickFalse)
965 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
966 (*images)->filename);
968 while (image->previous != (Image *) NULL)
969 image=image->previous;
970 if (image == *images)
971 *images=(*images)->next;
972 if (image->next != (Image *) NULL)
974 image->next->previous=(Image *) NULL;
975 image->next=(Image *) NULL;
981 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
985 % R e m o v e L a s t I m a g e F r o m L i s t %
989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
991 % RemoveLastImageFromList() removes and returns the last image from the list.
993 % If the given image list pointer pointed to the removed last image, it is
994 % set to the new last image of list, or NULL if list was emptied, otherwise
997 % The format of the RemoveLastImageFromList method is:
999 % Image *RemoveLastImageFromList(Image **images)
1001 % A description of each parameter follows:
1003 % o images: the image list.
1006 MagickExport Image *RemoveLastImageFromList(Image **images)
1011 assert(images != (Image **) NULL);
1012 if ((*images) == (Image *) NULL)
1013 return((Image *) NULL);
1014 assert((*images)->signature == MagickSignature);
1015 if ((*images)->debug != MagickFalse)
1016 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1017 (*images)->filename);
1019 while (image->next != (Image *) NULL)
1021 if (image == *images)
1022 *images=(*images)->previous;
1023 if (image->previous != (Image *) NULL)
1025 image->previous->next=(Image *) NULL;
1026 image->previous=(Image *) NULL;
1032 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1036 % R e p l a c e I m a g e I n L i s t %
1040 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1042 % ReplaceImageInList() replaces an image in the list. Old image is destroyed.
1043 % The given image list pointer is set to point to the just inserted image.
1045 % The format of the ReplaceImageInList method is:
1047 % ReplaceImageInList(Image **images,Image *image)
1049 % A description of each parameter follows:
1051 % o images: the image list.
1053 % o image: the image.
1056 MagickExport void ReplaceImageInList(Image **images,Image *image)
1058 assert(images != (Image **) NULL);
1059 assert(image != (Image *) NULL);
1060 assert(image->signature == MagickSignature);
1061 if (image->debug != MagickFalse)
1062 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1063 if ((*images) == (Image *) NULL)
1065 assert((*images)->signature == MagickSignature);
1066 image->next=(*images)->next;
1067 if (image->next != (Image *) NULL)
1068 image->next->previous=image;
1069 image->previous=(*images)->previous;
1070 if (image->previous != (Image *) NULL)
1071 image->previous->next=image;
1072 (void) DestroyImage(*images);
1077 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1081 % R e v e r s e I m a g e L i s t %
1085 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1087 % ReverseImageList() reverses the order of an image list.
1088 % The list pointer is reset to that start of the re-ordered list.
1090 % The format of the ReverseImageList method is:
1092 % void ReverseImageList(Image **images)
1094 % A description of each parameter follows:
1096 % o images: the image list.
1099 MagickExport void ReverseImageList(Image **images)
1107 assert(images != (Image **) NULL);
1108 if ((*images) == (Image *) NULL)
1110 assert((*images)->signature == MagickSignature);
1111 if ((*images)->debug != MagickFalse)
1112 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1113 (*images)->filename);
1114 for (p=(*images); p->next != (Image *) NULL; p=p->next) ;
1116 for ( ; p != (Image *) NULL; p=p->next)
1119 p->next=p->previous;
1125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1129 % S p l i c e I m a g e I n t o L i s t %
1133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1135 % SpliceImageIntoList() removes 'length' images from the list and replaces
1136 % them with the specified splice. Removed images are returned.
1138 % The format of the SpliceImageIntoList method is:
1140 % SpliceImageIntoList(Image **images,const unsigned long,
1141 % const Image *splice)
1143 % A description of each parameter follows:
1145 % o images: the image list.
1147 % o length: the length of the image list to remove.
1149 % o splice: Replace the removed image list with this list.
1152 MagickExport Image *SpliceImageIntoList(Image **images,
1153 const unsigned long length,const Image *splice)
1159 register unsigned long
1162 assert(images != (Image **) NULL);
1163 assert(splice != (Image *) NULL);
1164 assert(splice->signature == MagickSignature);
1165 if ((*images) == (Image *) NULL)
1166 return((Image *) NULL);
1167 assert((*images)->signature == MagickSignature);
1168 if ((*images)->debug != MagickFalse)
1169 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1170 (*images)->filename);
1171 split=SplitImageList(*images);
1172 AppendImageToList(images,splice);
1173 image=(Image *) NULL;
1174 for (i=0; (i < length) && (split != (Image *) NULL); i++)
1175 AppendImageToList(&image,RemoveImageFromList(&split));
1176 AppendImageToList(images,split);
1181 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1185 % S p l i t I m a g e L i s t %
1189 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1191 % SplitImageList() splits an image into two lists, after given image
1192 % The list that was split off is returned, which may be empty.
1194 % The format of the SplitImageList method is:
1196 % Image *SplitImageList(Image *images)
1198 % A description of each parameter follows:
1200 % o images: the image list.
1203 MagickExport Image *SplitImageList(Image *images)
1205 if ((images == (Image *) NULL) || (images->next == (Image *) NULL))
1206 return((Image *) NULL);
1207 images=images->next;
1208 images->previous->next=(Image *) NULL;
1209 images->previous=(Image *) NULL;
1214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1218 + S y n c I m a g e L i s t %
1222 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1224 % SyncImageList() synchronizes the scene numbers in an image list.
1226 % The format of the SyncImageList method is:
1228 % void SyncImageList(Image *images)
1230 % A description of each parameter follows:
1232 % o images: the image list.
1235 MagickExport void SyncImageList(Image *images)
1241 if (images == (Image *) NULL)
1243 assert(images->signature == MagickSignature);
1244 for (p=images; p != (Image *) NULL; p=p->next)
1246 for (q=p->next; q != (Image *) NULL; q=q->next)
1247 if (p->scene == q->scene)
1249 if (q != (Image *) NULL)
1252 if (p == (Image *) NULL)
1254 for (p=images->next; p != (Image *) NULL; p=p->next)
1255 p->scene=p->previous->scene+1;
1259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1263 + S y n c N e x t I m a g e I n L i s t %
1267 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1269 % SyncNextImageInList() returns the next image in the list after the blob
1270 % referenced is synchronized with the current image.
1272 % The format of the SyncNextImageInList method is:
1274 % Image *SyncNextImageInList(const Image *images)
1276 % A description of each parameter follows:
1278 % o images: the image list.
1281 MagickExport Image *SyncNextImageInList(const Image *images)
1283 if (images == (Image *) NULL)
1284 return((Image *) NULL);
1285 assert(images->signature == MagickSignature);
1286 if (images->next == (Image *) NULL)
1287 return((Image *) NULL);
1288 if (images->blob != images->next->blob)
1290 DestroyBlob(images->next);
1291 images->next->blob=ReferenceBlob(images->blob);
1293 images->next->endian=images->endian;
1294 return(images->next);