MagickCore  6.7.5
list.c
Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %                         L      IIIII  SSSSS  TTTTT                          %
00007 %                         L        I    SS       T                            %
00008 %                         L        I     SSS     T                            %
00009 %                         L        I       SS    T                            %
00010 %                         LLLLL  IIIII  SSSSS    T                            %
00011 %                                                                             %
00012 %                                                                             %
00013 %                        MagickCore Image List Methods                        %
00014 %                                                                             %
00015 %                              Software Design                                %
00016 %                                John Cristy                                  %
00017 %                               December 2002                                 %
00018 %                                                                             %
00019 %                                                                             %
00020 %  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
00021 %  dedicated to making software imaging solutions freely available.           %
00022 %                                                                             %
00023 %  You may not use this file except in compliance with the License.  You may  %
00024 %  obtain a copy of the License at                                            %
00025 %                                                                             %
00026 %    http://www.imagemagick.org/script/license.php                            %
00027 %                                                                             %
00028 %  Unless required by applicable law or agreed to in writing, software        %
00029 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00030 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00031 %  See the License for the specific language governing permissions and        %
00032 %  limitations under the License.                                             %
00033 %                                                                             %
00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00035 %
00036 %
00037 %
00038 */
00039 
00040 /*
00041   Include declarations.
00042 */
00043 #include "MagickCore/studio.h"
00044 #include "MagickCore/blob.h"
00045 #include "MagickCore/blob-private.h"
00046 #include "MagickCore/exception.h"
00047 #include "MagickCore/exception-private.h"
00048 #include "MagickCore/list.h"
00049 #include "MagickCore/memory_.h"
00050 #include "MagickCore/string_.h"
00051 
00052 /*
00053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00054 %                                                                             %
00055 %                                                                             %
00056 %                                                                             %
00057 %   A p p e n d I m a g e T o L i s t                                         %
00058 %                                                                             %
00059 %                                                                             %
00060 %                                                                             %
00061 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00062 %
00063 %  AppendImageToList() appends the second image list to the end of the first
00064 %  list.  The given image list pointer is left unchanged, unless it was empty.
00065 %
00066 %  The format of the AppendImageToList method is:
00067 %
00068 %      AppendImageToList(Image *images,const Image *image)
00069 %
00070 %  A description of each parameter follows:
00071 %
00072 %    o images: the image list to be appended to.
00073 %
00074 %    o image: the appended image or image list.
00075 %
00076 */
00077 MagickExport void AppendImageToList(Image **images,const Image *append)
00078 {
00079   register Image
00080     *p,
00081     *q;
00082 
00083   assert(images != (Image **) NULL);
00084   if (append == (Image *) NULL)
00085     return;
00086   assert(append->signature == MagickSignature);
00087   if (append->debug != MagickFalse)
00088     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",append->filename);
00089   if ((*images) == (Image *) NULL)
00090     {
00091       *images=(Image *) append;
00092       return;
00093     }
00094   assert((*images)->signature == MagickSignature);
00095   p=GetLastImageInList(*images);
00096   q=GetFirstImageInList(append);
00097   p->next=q;
00098   q->previous=p;
00099 }
00100 
00101 /*
00102 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00103 %                                                                             %
00104 %                                                                             %
00105 %                                                                             %
00106 %   C l o n e I m a g e L i s t                                               %
00107 %                                                                             %
00108 %                                                                             %
00109 %                                                                             %
00110 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00111 %
00112 %  CloneImageList() returns a duplicate of the image list.
00113 %
00114 %  The format of the CloneImageList method is:
00115 %
00116 %      Image *CloneImageList(const Image *images,ExceptionInfo *exception)
00117 %
00118 %  A description of each parameter follows:
00119 %
00120 %    o images: the image list.
00121 %
00122 %    o exception: return any errors or warnings in this structure.
00123 %
00124 */
00125 MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
00126 {
00127   Image
00128     *clone,
00129     *image;
00130 
00131   register Image
00132     *p;
00133 
00134   if (images == (Image *) NULL)
00135     return((Image *) NULL);
00136   assert(images->signature == MagickSignature);
00137   while (images->previous != (Image *) NULL)
00138     images=images->previous;
00139   image=(Image *) NULL;
00140   for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
00141   {
00142     clone=CloneImage(images,0,0,MagickTrue,exception);
00143     if (clone == (Image *) NULL)
00144       {
00145         if (image != (Image *) NULL)
00146           image=DestroyImageList(image);
00147         return((Image *) NULL);
00148       }
00149     if (image == (Image *) NULL)
00150       {
00151         image=clone;
00152         p=image;
00153         continue;
00154       }
00155     p->next=clone;
00156     clone->previous=p;
00157     p=p->next;
00158   }
00159   return(image);
00160 }
00161 
00162 /*
00163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00164 %                                                                             %
00165 %                                                                             %
00166 %                                                                             %
00167 %   C l o n e I m a g e s                                                     %
00168 %                                                                             %
00169 %                                                                             %
00170 %                                                                             %
00171 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00172 %
00173 %  CloneImages() clones one or more images from an image sequence, using a
00174 %  comma separated list of image numbers or ranges.
00175 %
00176 %  The numbers start at 0 for the first image in the list, while negative
00177 %  numbers refer to images starting counting from the end of the range. Images
00178 %  may be refered to multiple times to clone them multiple times. Images
00179 %  refered beyond the available number of images in list are ignored.
00180 %
00181 %  Images referenced may be reversed, and results in a clone of those images
00182 %  also being made with a reversed order.
00183 %
00184 %  The format of the CloneImages method is:
00185 %
00186 %      Image *CloneImages(const Image *images,const char *scenes,
00187 %        ExceptionInfo *exception)
00188 %
00189 %  A description of each parameter follows:
00190 %
00191 %    o images: the image sequence.
00192 %
00193 %    o scenes: This character string specifies which scenes to clone
00194 %      (e.g. 1,3-5,7-3,2).
00195 %
00196 %    o exception: return any errors or warnings in this structure.
00197 %
00198 */
00199 MagickExport Image *CloneImages(const Image *images,const char *scenes,
00200   ExceptionInfo *exception)
00201 {
00202   char
00203     *p;
00204 
00205   const Image
00206     *next;
00207 
00208   Image
00209     *clone_images,
00210     *image;
00211 
00212   long
00213     first,
00214     last,
00215     step;
00216 
00217   register ssize_t
00218     i;
00219 
00220   size_t
00221     length;
00222 
00223   assert(images != (const Image *) NULL);
00224   assert(images->signature == MagickSignature);
00225   assert(scenes != (char *) NULL);
00226   if (images->debug != MagickFalse)
00227     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00228   assert(exception != (ExceptionInfo *) NULL);
00229   assert(exception->signature == MagickSignature);
00230   clone_images=NewImageList();
00231   images=GetFirstImageInList(images);
00232   length=GetImageListLength(images);
00233   for (p=(char *) scenes; *p != '\0';)
00234   {
00235     while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
00236       p++;
00237     first=strtol(p,&p,10);
00238     if (first < 0)
00239       first+=(long) length;
00240     last=first;
00241     while (isspace((int) ((unsigned char) *p)) != 0)
00242       p++;
00243     if (*p == '-')
00244       {
00245         last=strtol(p+1,&p,10);
00246         if (last < 0)
00247           last+=(long) length;
00248       }
00249     for (step=first > last ? -1 : 1; first != (last+step); first+=step)
00250     {
00251       i=0;
00252       for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
00253       {
00254         if (i == (ssize_t) first)
00255           {
00256             image=CloneImage(next,0,0,MagickTrue,exception);
00257             if (image == (Image *) NULL)
00258               break;
00259             AppendImageToList(&clone_images,image);
00260           }
00261         i++;
00262       }
00263     }
00264   }
00265   return(GetFirstImageInList(clone_images));
00266 }
00267 
00268 /*
00269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00270 %                                                                             %
00271 %                                                                             %
00272 %                                                                             %
00273 %   D e l e t e I m a g e F r o m L i s t                                     %
00274 %                                                                             %
00275 %                                                                             %
00276 %                                                                             %
00277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00278 %
00279 %  DeleteImageFromList() deletes an image from the list. List pointer
00280 %  is moved to the next image, if one is present. See RemoveImageFromList().
00281 %
00282 %  The format of the DeleteImageFromList method is:
00283 %
00284 %      DeleteImageFromList(Image **images)
00285 %
00286 %  A description of each parameter follows:
00287 %
00288 %    o images: the image list.
00289 %
00290 */
00291 MagickExport void DeleteImageFromList(Image **images)
00292 {
00293   Image
00294     *image;
00295 
00296   image=RemoveImageFromList(images);
00297   if (image != (Image *) NULL)
00298     (void) DestroyImage(image);
00299 }
00300 
00301 /*
00302 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00303 %                                                                             %
00304 %                                                                             %
00305 %                                                                             %
00306 %   D e l e t e I m a g e s                                                   %
00307 %                                                                             %
00308 %                                                                             %
00309 %                                                                             %
00310 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00311 %
00312 %  DeleteImages() deletes one or more images from an image sequence, using a
00313 %  comma separated list of image numbers or ranges.
00314 %
00315 %  The numbers start at 0 for the first image, while negative numbers refer to
00316 %  images starting counting from the end of the range. Images may be refered to
00317 %  multiple times without problems. Image refered beyond the available number
00318 %  of images in list are ignored.
00319 %
00320 %  If the referenced images are in the reverse order, that range will be
00321 %  completely ignored, unlike CloneImages().
00322 %
00323 %  The format of the DeleteImages method is:
00324 %
00325 %      DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
00326 %
00327 %  A description of each parameter follows:
00328 %
00329 %    o images: the image sequence.
00330 %
00331 %    o scenes: This character string specifies which scenes to delete
00332 %      (e.g. 1,3-5,-2-6,2).
00333 %
00334 %    o exception: return any errors or warnings in this structure.
00335 %
00336 */
00337 MagickExport void DeleteImages(Image **images,const char *scenes,
00338   ExceptionInfo *exception)
00339 {
00340   char
00341     *p;
00342 
00343   Image
00344     *image;
00345 
00346   long
00347     first,
00348     last;
00349 
00350   MagickBooleanType
00351     *delete_list;
00352 
00353   register ssize_t
00354     i;
00355 
00356   size_t
00357     length;
00358 
00359   assert(images != (Image **) NULL);
00360   assert((*images)->signature == MagickSignature);
00361   assert(scenes != (char *) NULL);
00362   if ((*images)->debug != MagickFalse)
00363     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
00364       (*images)->filename);
00365   assert(exception != (ExceptionInfo *) NULL);
00366   assert(exception->signature == MagickSignature);
00367   *images=GetFirstImageInList(*images);
00368   length=GetImageListLength(*images);
00369   delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
00370     sizeof(*delete_list));
00371   if (delete_list == (MagickBooleanType *) NULL)
00372     {
00373       (void) ThrowMagickException(exception,GetMagickModule(),
00374         ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
00375       return;
00376     }
00377   image=(*images);
00378   for (i=0; i < (ssize_t) length; i++)
00379     delete_list[i]=MagickFalse;
00380   /*
00381     Note which images will be deleted, avoid duplicate deleted
00382   */
00383   for (p=(char *) scenes; *p != '\0';)
00384   {
00385     while ((isspace((int) *p) != 0) || (*p == ','))
00386       p++;
00387     first=strtol(p,&p,10);
00388     if (first < 0)
00389       first+=(long) length;
00390     last=first;
00391     while (isspace((int) ((unsigned char) *p)) != 0)
00392       p++;
00393     if (*p == '-')
00394       {
00395         last=strtol(p+1,&p,10);
00396         if (last < 0)
00397           last+=(long) length;
00398       }
00399     if (first > last)
00400       continue;
00401     for (i=(ssize_t) first; i <= (ssize_t) last; i++)
00402       if ((i >= 0) && (i < (ssize_t) length))
00403         delete_list[i]=MagickTrue;
00404   }
00405   /*
00406     Delete images marked for deletion, once only
00407   */
00408   image=(*images);
00409   for (i=0; i < (ssize_t) length; i++)
00410   {
00411     *images=image;
00412     image=GetNextImageInList(image);
00413     if (delete_list[i] != MagickFalse)
00414       DeleteImageFromList(images);
00415 
00416   }
00417   (void) RelinquishMagickMemory(delete_list);
00418   *images=GetFirstImageInList(*images);
00419 }
00420 
00421 /*
00422 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00423 %                                                                             %
00424 %                                                                             %
00425 %                                                                             %
00426 %   D e s t r o y I m a g e L i s t                                           %
00427 %                                                                             %
00428 %                                                                             %
00429 %                                                                             %
00430 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00431 %
00432 %  DestroyImageList() destroys an image list.
00433 %
00434 %  The format of the DestroyImageList method is:
00435 %
00436 %      Image *DestroyImageList(Image *image)
00437 %
00438 %  A description of each parameter follows:
00439 %
00440 %    o image: the image sequence.
00441 %
00442 */
00443 MagickExport Image *DestroyImageList(Image *images)
00444 {
00445   if (images == (Image *) NULL)
00446     return((Image *) NULL);
00447   assert(images->signature == MagickSignature);
00448   if (images->debug != MagickFalse)
00449     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00450   while (images != (Image *) NULL)
00451     DeleteImageFromList(&images);
00452   return((Image *) NULL);
00453 }
00454 
00455 /*
00456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00457 %                                                                             %
00458 %                                                                             %
00459 %                                                                             %
00460 %   D u p l i c a t e I m a g e s                                             %
00461 %                                                                             %
00462 %                                                                             %
00463 %                                                                             %
00464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00465 %
00466 %  DuplicateImages() duplicates one or more images from an image sequence,
00467 %  using a count and a comma separated list of image numbers or ranges.
00468 %
00469 %  The numbers start at 0 for the first image, while negative numbers refer to
00470 %  images starting counting from the end of the range. Images may be refered to
00471 %  multiple times without problems. Image refered beyond the available number
00472 %  of images in list are ignored.
00473 %
00474 %  The format of the DuplicateImages method is:
00475 %
00476 %      Image *DuplicateImages(Image *images,const size_t number_duplicates,
00477 %        const char *scenes,ExceptionInfo *exception)
00478 %
00479 %  A description of each parameter follows:
00480 %
00481 %    o images: the image sequence.
00482 %
00483 %    o number_duplicates: duplicate the image sequence this number of times.
00484 %
00485 %    o scenes: This character string specifies which scenes to duplicate (e.g.
00486 %      1,3-5,-2-6,2).
00487 %
00488 %    o exception: return any errors or warnings in this structure.
00489 %
00490 */
00491 MagickExport Image *DuplicateImages(Image *images,
00492   const size_t number_duplicates,const char *scenes,ExceptionInfo *exception)
00493 {
00494   Image
00495     *clone_images,
00496     *duplicate_images;
00497 
00498   register ssize_t
00499     i;
00500 
00501   /*
00502     Duplicate images.
00503   */
00504   assert(images != (Image *) NULL);
00505   assert(images->signature == MagickSignature);
00506   assert(scenes != (char *) NULL);
00507   if (images->debug != MagickFalse)
00508     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00509   assert(exception != (ExceptionInfo *) NULL);
00510   assert(exception->signature == MagickSignature);
00511   duplicate_images=NewImageList();
00512   for (i=0; i < (ssize_t) number_duplicates; i++)
00513   {
00514     clone_images=CloneImages(images,scenes,exception);
00515     AppendImageToList(&duplicate_images,clone_images);
00516   }
00517   return(duplicate_images);
00518 }
00519 
00520 /*
00521 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00522 %                                                                             %
00523 %                                                                             %
00524 %                                                                             %
00525 %   G e t F i r s t I m a g e I n L i s t                                     %
00526 %                                                                             %
00527 %                                                                             %
00528 %                                                                             %
00529 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00530 %
00531 %  GetFirstImageInList() returns a pointer to the first image in the list.
00532 %
00533 %  The format of the GetFirstImageInList method is:
00534 %
00535 %      Image *GetFirstImageInList(const Image *images)
00536 %
00537 %  A description of each parameter follows:
00538 %
00539 %    o images: the image list.
00540 %
00541 */
00542 MagickExport Image *GetFirstImageInList(const Image *images)
00543 {
00544   register const Image
00545     *p;
00546 
00547   if (images == (Image *) NULL)
00548     return((Image *) NULL);
00549   assert(images->signature == MagickSignature);
00550   for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
00551   return((Image *) p);
00552 }
00553 
00554 /*
00555 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00556 %                                                                             %
00557 %                                                                             %
00558 %                                                                             %
00559 %   G e t I m a g e F r o m L i s t                                           %
00560 %                                                                             %
00561 %                                                                             %
00562 %                                                                             %
00563 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00564 %
00565 %  GetImageFromList() returns an image at the specified index from the image
00566 %  list. Starting with 0 as the first image in the list.
00567 %
00568 %  A negative offset will return the image from the end of the list, such that
00569 %  an index of -1 is the last image.
00570 %
00571 %  If no such image exists at the specified offset a NULL image pointer is
00572 %  returned.  This will only happen if index is less that the negative of
00573 %  the list length, or larger than list length -1.  EG: ( -N to N-1 )
00574 %
00575 %  The format of the GetImageFromList method is:
00576 %
00577 %      Image *GetImageFromList(const Image *images,const ssize_t index)
00578 %
00579 %  A description of each parameter follows:
00580 %
00581 %    o images: the image list.
00582 %
00583 %    o index: the position within the list.
00584 %
00585 */
00586 MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
00587 {
00588   register const Image
00589     *p;
00590 
00591   register ssize_t
00592     i;
00593 
00594   if (images == (Image *) NULL)
00595     return((Image *) NULL);
00596   assert(images->signature == MagickSignature);
00597   if (images->debug != MagickFalse)
00598     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00599 
00600   /*
00601     Designed to efficiently find first image (index == 0), or last image
00602     (index == -1) as appropriate, without to go through the whole image list,
00603     unless the offset is outside of the list length range.
00604 
00605     That is it tries to avoid 'counting the whole list' to handle the index.
00606   */
00607   if ( index < 0 )
00608     {
00609       p=GetLastImageInList(images);
00610       for (i=-1; p != (Image *) NULL; p=p->previous)
00611         if (i-- == index)
00612           break;
00613     }
00614   else
00615     {
00616       p=GetFirstImageInList(images);
00617       for (i=0; p != (Image *) NULL; p=p->next)
00618         if (i++ == index)
00619           break;
00620     }
00621   return((Image *) p);
00622 }
00623 
00624 /*
00625 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00626 %                                                                             %
00627 %                                                                             %
00628 %                                                                             %
00629 %   G e t I m a g e I n d e x I n L i s t                                     %
00630 %                                                                             %
00631 %                                                                             %
00632 %                                                                             %
00633 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00634 %
00635 %  GetImageIndexInList() returns the offset in the list of the specified image.
00636 %
00637 %  The format of the GetImageIndexInList method is:
00638 %
00639 %      ssize_t GetImageIndexInList(const Image *images)
00640 %
00641 %  A description of each parameter follows:
00642 %
00643 %    o images: the image list.
00644 %
00645 */
00646 MagickExport ssize_t GetImageIndexInList(const Image *images)
00647 {
00648   register ssize_t
00649     i;
00650 
00651   if (images == (const Image *) NULL)
00652     return(-1);
00653   assert(images->signature == MagickSignature);
00654   for (i=0; images->previous != (Image *) NULL; i++)
00655     images=images->previous;
00656   return(i);
00657 }
00658 
00659 /*
00660 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00661 %                                                                             %
00662 %                                                                             %
00663 %                                                                             %
00664 %   G e t I m a g e L i s t L e n g t h                                       %
00665 %                                                                             %
00666 %                                                                             %
00667 %                                                                             %
00668 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00669 %
00670 %  GetImageListLength() returns the length of the list (the number of images in
00671 %  the list).
00672 %
00673 %  The format of the GetImageListLength method is:
00674 %
00675 %      size_t GetImageListLength(const Image *images)
00676 %
00677 %  A description of each parameter follows:
00678 %
00679 %    o images: the image list.
00680 %
00681 */
00682 MagickExport size_t GetImageListLength(const Image *images)
00683 {
00684   register ssize_t
00685     i;
00686 
00687   if (images == (Image *) NULL)
00688     return(0);
00689   assert(images->signature == MagickSignature);
00690   if (images->debug != MagickFalse)
00691     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00692   images=GetLastImageInList(images);
00693   for (i=0; images != (Image *) NULL; images=images->previous)
00694     i++;
00695   return((size_t) i);
00696 }
00697 
00698 /*
00699 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00700 %                                                                             %
00701 %                                                                             %
00702 %                                                                             %
00703 %   G e t L a s t I m a g e I n L i s t                                       %
00704 %                                                                             %
00705 %                                                                             %
00706 %                                                                             %
00707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00708 %
00709 %  GetLastImageInList() returns a pointer to the last image in the list.
00710 %
00711 %  The format of the GetLastImageInList method is:
00712 %
00713 %      Image *GetLastImageInList(const Image *images)
00714 %
00715 %  A description of each parameter follows:
00716 %
00717 %    o images: the image list.
00718 %
00719 */
00720 MagickExport Image *GetLastImageInList(const Image *images)
00721 {
00722   register const Image
00723     *p;
00724 
00725   if (images == (Image *) NULL)
00726     return((Image *) NULL);
00727   assert(images->signature == MagickSignature);
00728   for (p=images; p->next != (Image *) NULL; p=p->next) ;
00729   return((Image *) p);
00730 }
00731 
00732 /*
00733 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00734 %                                                                             %
00735 %                                                                             %
00736 %                                                                             %
00737 %   G e t N e x t I m a g e I n L i s t                                       %
00738 %                                                                             %
00739 %                                                                             %
00740 %                                                                             %
00741 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00742 %
00743 %  GetNextImageInList() returns the next image in the list.
00744 %
00745 %  The format of the GetNextImageInList method is:
00746 %
00747 %      Image *GetNextImageInList(const Image *images)
00748 %
00749 %  A description of each parameter follows:
00750 %
00751 %    o images: the image list.
00752 %
00753 */
00754 MagickExport Image *GetNextImageInList(const Image *images)
00755 {
00756   if (images == (Image *) NULL)
00757     return((Image *) NULL);
00758   assert(images->signature == MagickSignature);
00759   if (images->debug != MagickFalse)
00760     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00761   return(images->next);
00762 }
00763 
00764 /*
00765 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00766 %                                                                             %
00767 %                                                                             %
00768 %                                                                             %
00769 %   G e t P r e v i o u s I m a g e I n L i s t                               %
00770 %                                                                             %
00771 %                                                                             %
00772 %                                                                             %
00773 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00774 %
00775 %  GetPreviousImageInList() returns the previous image in the list.
00776 %
00777 %  The format of the GetPreviousImageInList method is:
00778 %
00779 %      Image *GetPreviousImageInList(const Image *images)
00780 %
00781 %  A description of each parameter follows:
00782 %
00783 %    o images: the image list.
00784 %
00785 */
00786 MagickExport Image *GetPreviousImageInList(const Image *images)
00787 {
00788   if (images == (Image *) NULL)
00789     return((Image *) NULL);
00790   assert(images->signature == MagickSignature);
00791   return(images->previous);
00792 }
00793 
00794 /*
00795 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00796 %                                                                             %
00797 %                                                                             %
00798 %     I m a g e L i s t T o A r r a y                                         %
00799 %                                                                             %
00800 %                                                                             %
00801 %                                                                             %
00802 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00803 %
00804 %  ImageListToArray() is a convenience method that converts an image list to
00805 %  a sequential array, with a NULL image pointer at the end of the array.
00806 %
00807 %  The images remain part of the original image list, with the array providing
00808 %  an alternative means of indexing the image array.
00809 %
00810 %    group = ImageListToArray(images, exception);
00811 %    while (i = 0; group[i] != (Image *) NULL; i++)
00812 %      printf("%s\n", group[i]->filename);
00813 %    printf("%d images\n", i);
00814 %    group = RelinquishMagickMemory(group);
00815 %
00816 %  The format of the ImageListToArray method is:
00817 %
00818 %      Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
00819 %
00820 %  A description of each parameter follows:
00821 %
00822 %    o image: the image list.
00823 %
00824 %    o exception: return any errors or warnings in this structure.
00825 %
00826 */
00827 MagickExport Image **ImageListToArray(const Image *images,
00828   ExceptionInfo *exception)
00829 {
00830   Image
00831     **group;
00832 
00833   register ssize_t
00834     i;
00835 
00836   if (images == (Image *) NULL)
00837     return((Image **) NULL);
00838   assert(images->signature == MagickSignature);
00839   if (images->debug != MagickFalse)
00840     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
00841   group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
00842     sizeof(*group));
00843   if (group == (Image **) NULL)
00844     {
00845       (void) ThrowMagickException(exception,GetMagickModule(),
00846         ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename);
00847       return((Image **) NULL);
00848     }
00849   images=GetFirstImageInList(images);
00850   for (i=0; images != (Image *) NULL; images=images->next)
00851     group[i++]=(Image *) images;
00852   group[i]=(Image *) NULL;
00853   return(group);
00854 }
00855 
00856 /*
00857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00858 %                                                                             %
00859 %                                                                             %
00860 %                                                                             %
00861 %   I n s e r t I m a g e I n L i s t                                         %
00862 %                                                                             %
00863 %                                                                             %
00864 %                                                                             %
00865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00866 %
00867 %  InsertImageInList() insert the given image or image list, into the first
00868 %  image list, immediately AFTER the image pointed to.  The given image list
00869 %  pointer is left unchanged unless previously empty.
00870 %
00871 %  The format of the InsertImageInList method is:
00872 %
00873 %      InsertImageInList(Image **images,Image *insert)
00874 %
00875 %  A description of each parameter follows:
00876 %
00877 %    o images: the image list to insert into.
00878 %
00879 %    o insert: the image list to insert.
00880 %
00881 */
00882 MagickExport void InsertImageInList(Image **images,Image *insert)
00883 {
00884   Image
00885     *split;
00886 
00887   assert(images != (Image **) NULL);
00888   assert(insert != (Image *) NULL);
00889   assert(insert->signature == MagickSignature);
00890   if (insert->debug != MagickFalse)
00891     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",insert->filename);
00892   if ((*images) == (Image *) NULL)
00893     return;
00894   assert((*images)->signature == MagickSignature);
00895   split=SplitImageList(*images);
00896   AppendImageToList(images,insert);
00897   AppendImageToList(images,split);
00898 }
00899 
00900 /*
00901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00902 %                                                                             %
00903 %                                                                             %
00904 %                                                                             %
00905 %   N e w I m a g e L i s t                                                   %
00906 %                                                                             %
00907 %                                                                             %
00908 %                                                                             %
00909 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00910 %
00911 %  NewImageList() creates an empty image list.
00912 %
00913 %  The format of the NewImageList method is:
00914 %
00915 %      Image *NewImageList(void)
00916 %
00917 */
00918 MagickExport Image *NewImageList(void)
00919 {
00920   return((Image *) NULL);
00921 }
00922 
00923 /*
00924 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00925 %                                                                             %
00926 %                                                                             %
00927 %                                                                             %
00928 %   P r e p e n d I m a g e T o L i s t                                       %
00929 %                                                                             %
00930 %                                                                             %
00931 %                                                                             %
00932 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00933 %
00934 %  PrependImageToList() prepends the image to the beginning of the list.
00935 %
00936 %  The format of the PrependImageToList method is:
00937 %
00938 %      PrependImageToList(Image *images,Image *image)
00939 %
00940 %  A description of each parameter follows:
00941 %
00942 %    o images: the image list.
00943 %
00944 %    o image: the image.
00945 %
00946 */
00947 MagickExport void PrependImageToList(Image **images,Image *image)
00948 {
00949   AppendImageToList(&image,*images);
00950 }
00951 
00952 /*
00953 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00954 %                                                                             %
00955 %                                                                             %
00956 %                                                                             %
00957 %   R e m o v e I m a g e F r o m L i s t                                     %
00958 %                                                                             %
00959 %                                                                             %
00960 %                                                                             %
00961 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00962 %
00963 %  RemoveImageFromList() removes and returns the image pointed to.
00964 %
00965 %  The given image list pointer is set to point to the next image in list
00966 %  if it exists, otherwise it is set to the previous image, or NULL if list
00967 %  was emptied.
00968 %
00969 %  The format of the RemoveImageFromList method is:
00970 %
00971 %      Image *RemoveImageFromList(Image **images)
00972 %
00973 %  A description of each parameter follows:
00974 %
00975 %    o images: the image list.
00976 %
00977 */
00978 MagickExport Image *RemoveImageFromList(Image **images)
00979 {
00980   register Image
00981     *p;
00982 
00983   assert(images != (Image **) NULL);
00984   if ((*images) == (Image *) NULL)
00985     return((Image *) NULL);
00986   assert((*images)->signature == MagickSignature);
00987   if ((*images)->debug != MagickFalse)
00988     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
00989       (*images)->filename);
00990   p=(*images);
00991   if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
00992     *images=(Image *) NULL;
00993   else
00994     {
00995       if (p->previous != (Image *) NULL)
00996         {
00997           p->previous->next=p->next;
00998           *images=p->previous;
00999         }
01000       if (p->next != (Image *) NULL)
01001         {
01002           p->next->previous=p->previous;
01003           *images=p->next;
01004         }
01005       p->previous=(Image *) NULL;
01006       p->next=(Image *) NULL;
01007     }
01008   return(p);
01009 }
01010 
01011 /*
01012 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01013 %                                                                             %
01014 %                                                                             %
01015 %                                                                             %
01016 %   R e m o v e F i r s t I m a g e F r o m L i s t                           %
01017 %                                                                             %
01018 %                                                                             %
01019 %                                                                             %
01020 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01021 %
01022 %  RemoveFirstImageFromList() removes and returns the first image in the list.
01023 %
01024 %  If the given image list pointer pointed to the removed first image, it is
01025 %  set to the new first image of list, or NULL if list was emptied, otherwise
01026 %  it is left as is.
01027 %
01028 %  The format of the RemoveFirstImageFromList method is:
01029 %
01030 %      Image *RemoveFirstImageFromList(Image **images)
01031 %
01032 %  A description of each parameter follows:
01033 %
01034 %    o images: the image list.
01035 %
01036 */
01037 MagickExport Image *RemoveFirstImageFromList(Image **images)
01038 {
01039   Image
01040     *image;
01041 
01042   assert(images != (Image **) NULL);
01043   if ((*images) == (Image *) NULL)
01044     return((Image *) NULL);
01045   assert((*images)->signature == MagickSignature);
01046   if ((*images)->debug != MagickFalse)
01047     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
01048       (*images)->filename);
01049   image=(*images);
01050   while (image->previous != (Image *) NULL)
01051     image=image->previous;
01052   if (image == *images)
01053     *images=(*images)->next;
01054   if (image->next != (Image *) NULL)
01055     {
01056       image->next->previous=(Image *) NULL;
01057       image->next=(Image *) NULL;
01058     }
01059   return(image);
01060 }
01061 
01062 /*
01063 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01064 %                                                                             %
01065 %                                                                             %
01066 %                                                                             %
01067 %   R e m o v e L a s t I m a g e F r o m L i s t                             %
01068 %                                                                             %
01069 %                                                                             %
01070 %                                                                             %
01071 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01072 %
01073 %  RemoveLastImageFromList() removes and returns the last image from the list.
01074 %
01075 %  If the given image list pointer pointed to the removed last image, it is
01076 %  set to the new last image of list, or NULL if list was emptied, otherwise
01077 %  it is left as is.
01078 %
01079 %  The format of the RemoveLastImageFromList method is:
01080 %
01081 %      Image *RemoveLastImageFromList(Image **images)
01082 %
01083 %  A description of each parameter follows:
01084 %
01085 %    o images: the image list.
01086 %
01087 */
01088 MagickExport Image *RemoveLastImageFromList(Image **images)
01089 {
01090   Image
01091     *image;
01092 
01093   assert(images != (Image **) NULL);
01094   if ((*images) == (Image *) NULL)
01095     return((Image *) NULL);
01096   assert((*images)->signature == MagickSignature);
01097   if ((*images)->debug != MagickFalse)
01098     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
01099       (*images)->filename);
01100   image=(*images);
01101   while (image->next != (Image *) NULL)
01102     image=image->next;
01103   if (image == *images)
01104     *images=(*images)->previous;
01105   if (image->previous != (Image *) NULL)
01106     {
01107       image->previous->next=(Image *) NULL;
01108       image->previous=(Image *) NULL;
01109     }
01110   return(image);
01111 }
01112 
01113 /*
01114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01115 %                                                                             %
01116 %                                                                             %
01117 %                                                                             %
01118 %   R e p l a c e I m a g e I n L i s t                                       %
01119 %                                                                             %
01120 %                                                                             %
01121 %                                                                             %
01122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01123 %
01124 %  ReplaceImageInList() replaces an image in the list with the given image, or
01125 %  list of images.  Old image is destroyed.
01126 %
01127 %  The images list pointer is set to point to the first image of the inserted
01128 %  list of images.
01129 %
01130 %  The format of the ReplaceImageInList method is:
01131 %
01132 %      ReplaceImageInList(Image **images,Image *replace)
01133 %
01134 %  A description of each parameter follows:
01135 %
01136 %    o images: the list and pointer to image to replace
01137 %
01138 %    o replace: the image or image list replacing the original
01139 %
01140 */
01141 MagickExport void ReplaceImageInList(Image **images,Image *replace)
01142 {
01143   assert(images != (Image **) NULL);
01144   assert(replace != (Image *) NULL);
01145   assert(replace->signature == MagickSignature);
01146   if (replace->debug != MagickFalse)
01147     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
01148   if ((*images) == (Image *) NULL)
01149     return;
01150   assert((*images)->signature == MagickSignature);
01151 
01152   /* link next pointer */
01153   replace=GetLastImageInList(replace);
01154   replace->next=(*images)->next;
01155   if (replace->next != (Image *) NULL)
01156     replace->next->previous=replace;
01157 
01158   /* link previous pointer - set images position to first replacement image */
01159   replace=GetFirstImageInList(replace);
01160   replace->previous=(*images)->previous;
01161   if (replace->previous != (Image *) NULL)
01162     replace->previous->next=replace;
01163 
01164   /* destroy the replaced image that was in images */
01165   (void) DestroyImage(*images);
01166   (*images)=replace;
01167 }
01168 
01169 /*
01170 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01171 %                                                                             %
01172 %                                                                             %
01173 %                                                                             %
01174 %   R e p l a c e I m a g e I n L i s t R e t u r n L a s t                   %
01175 %                                                                             %
01176 %                                                                             %
01177 %                                                                             %
01178 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01179 %
01180 %  ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except
01181 %  the images pointer is set to the last image in the list of replacemen
01182 %  images.
01183 %
01184 %  This allows you to simply use GetNextImageInList() to go to the image
01185 %  that follows the just replaced image, even if a list of replacement images
01186 %  was inserted.
01187 %
01188 %  The format of the ReplaceImageInList method is:
01189 %
01190 %      ReplaceImageInListReturnLast(Image **images,Image *replace)
01191 %
01192 %  A description of each parameter follows:
01193 %
01194 %    o images: the list and pointer to image to replace
01195 %
01196 %    o replace: the image or image list replacing the original
01197 %
01198 */
01199 MagickExport void ReplaceImageInListReturnLast(Image **images,Image *replace)
01200 {
01201   assert(images != (Image **) NULL);
01202   assert(replace != (Image *) NULL);
01203   assert(replace->signature == MagickSignature);
01204   if (replace->debug != MagickFalse)
01205     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
01206   if ((*images) == (Image *) NULL)
01207     return;
01208   assert((*images)->signature == MagickSignature);
01209 
01210   /* link previous pointer */
01211   replace=GetFirstImageInList(replace);
01212   replace->previous=(*images)->previous;
01213   if (replace->previous != (Image *) NULL)
01214     replace->previous->next=replace;
01215 
01216   /* link next pointer - set images position to last replacement image */
01217   replace=GetLastImageInList(replace);
01218   replace->next=(*images)->next;
01219   if (replace->next != (Image *) NULL)
01220     replace->next->previous=replace;
01221 
01222   /* destroy the replaced image that was in images */
01223   (void) DestroyImage(*images);
01224   (*images)=replace;
01225 }
01226 
01227 /*
01228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01229 %                                                                             %
01230 %                                                                             %
01231 %                                                                             %
01232 %   R e v e r s e I m a g e L i s t                                           %
01233 %                                                                             %
01234 %                                                                             %
01235 %                                                                             %
01236 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01237 %
01238 %  ReverseImageList() reverses the order of an image list.
01239 %  The list pointer is reset to that start of the re-ordered list.
01240 %
01241 %  The format of the ReverseImageList method is:
01242 %
01243 %      void ReverseImageList(Image **images)
01244 %
01245 %  A description of each parameter follows:
01246 %
01247 %    o images: the image list.
01248 %
01249 */
01250 MagickExport void ReverseImageList(Image **images)
01251 {
01252   Image
01253     *next;
01254 
01255   register Image
01256     *p;
01257 
01258   assert(images != (Image **) NULL);
01259   if ((*images) == (Image *) NULL)
01260     return;
01261   assert((*images)->signature == MagickSignature);
01262   if ((*images)->debug != MagickFalse)
01263     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
01264       (*images)->filename);
01265   for (p=(*images); p->next != (Image *) NULL; p=p->next) ;
01266   *images=p;
01267   for ( ; p != (Image *) NULL; p=p->next)
01268   {
01269     next=p->next;
01270     p->next=p->previous;
01271     p->previous=next;
01272   }
01273 }
01274 
01275 /*
01276 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01277 %                                                                             %
01278 %                                                                             %
01279 %                                                                             %
01280 %   S p l i c e I m a g e I n t o L i s t                                     %
01281 %                                                                             %
01282 %                                                                             %
01283 %                                                                             %
01284 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01285 %
01286 %  SpliceImageIntoList() removes 'length' images from the list and replaces
01287 %  them with the specified splice. Removed images are returned.
01288 %
01289 %  The format of the SpliceImageIntoList method is:
01290 %
01291 %      SpliceImageIntoList(Image **images,const size_t,
01292 %        const Image *splice)
01293 %
01294 %  A description of each parameter follows:
01295 %
01296 %    o images: the image list.
01297 %
01298 %    o length: the length of the image list to remove.
01299 %
01300 %    o splice: Replace the removed image list with this list.
01301 %
01302 */
01303 MagickExport Image *SpliceImageIntoList(Image **images,
01304   const size_t length,const Image *splice)
01305 {
01306   Image
01307     *image,
01308     *split;
01309 
01310   register size_t
01311     i;
01312 
01313   assert(images != (Image **) NULL);
01314   assert(splice != (Image *) NULL);
01315   assert(splice->signature == MagickSignature);
01316   if ((*images) == (Image *) NULL)
01317     return((Image *) NULL);
01318   assert((*images)->signature == MagickSignature);
01319   if ((*images)->debug != MagickFalse)
01320     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
01321       (*images)->filename);
01322   split=SplitImageList(*images);
01323   AppendImageToList(images,splice);
01324   image=(Image *) NULL;
01325   for (i=0; (i < length) && (split != (Image *) NULL); i++)
01326     AppendImageToList(&image,RemoveImageFromList(&split));
01327   AppendImageToList(images,split);
01328   return(image);
01329 }
01330 
01331 /*
01332 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01333 %                                                                             %
01334 %                                                                             %
01335 %                                                                             %
01336 %   S p l i t I m a g e L i s t                                               %
01337 %                                                                             %
01338 %                                                                             %
01339 %                                                                             %
01340 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01341 %
01342 %  SplitImageList() splits an image into two lists, after given image
01343 %  The list that was split off is returned, which may be empty.
01344 %
01345 %  The format of the SplitImageList method is:
01346 %
01347 %      Image *SplitImageList(Image *images)
01348 %
01349 %  A description of each parameter follows:
01350 %
01351 %    o images: the image list.
01352 %
01353 */
01354 MagickExport Image *SplitImageList(Image *images)
01355 {
01356   if ((images == (Image *) NULL) || (images->next == (Image *) NULL))
01357     return((Image *) NULL);
01358   images=images->next;
01359   images->previous->next=(Image *) NULL;
01360   images->previous=(Image *) NULL;
01361   return(images);
01362 }
01363 
01364 /*
01365 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01366 %                                                                             %
01367 %                                                                             %
01368 %                                                                             %
01369 +   S y n c I m a g e L i s t                                                 %
01370 %                                                                             %
01371 %                                                                             %
01372 %                                                                             %
01373 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01374 %
01375 %  SyncImageList() synchronizes the scene numbers in an image list.
01376 %
01377 %  The format of the SyncImageList method is:
01378 %
01379 %      void SyncImageList(Image *images)
01380 %
01381 %  A description of each parameter follows:
01382 %
01383 %    o images: the image list.
01384 %
01385 */
01386 MagickExport void SyncImageList(Image *images)
01387 {
01388   register Image
01389     *p,
01390     *q;
01391 
01392   if (images == (Image *) NULL)
01393     return;
01394   assert(images->signature == MagickSignature);
01395   for (p=images; p != (Image *) NULL; p=p->next)
01396   {
01397     for (q=p->next; q != (Image *) NULL; q=q->next)
01398       if (p->scene == q->scene)
01399         break;
01400     if (q != (Image *) NULL)
01401       break;
01402   }
01403   if (p == (Image *) NULL)
01404     return;
01405   for (p=images->next; p != (Image *) NULL; p=p->next)
01406     p->scene=p->previous->scene+1;
01407 }
01408 
01409 /*
01410 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01411 %                                                                             %
01412 %                                                                             %
01413 %                                                                             %
01414 +   S y n c N e x t I m a g e I n L i s t                                     %
01415 %                                                                             %
01416 %                                                                             %
01417 %                                                                             %
01418 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01419 %
01420 %  SyncNextImageInList() returns the next image in the list after the blob
01421 %  referenced is synchronized with the current image.
01422 %
01423 %  The format of the SyncNextImageInList method is:
01424 %
01425 %      Image *SyncNextImageInList(const Image *images)
01426 %
01427 %  A description of each parameter follows:
01428 %
01429 %    o images: the image list.
01430 %
01431 */
01432 MagickExport Image *SyncNextImageInList(const Image *images)
01433 {
01434   if (images == (Image *) NULL)
01435     return((Image *) NULL);
01436   assert(images->signature == MagickSignature);
01437   if (images->next == (Image *) NULL)
01438     return((Image *) NULL);
01439   if (images->blob != images->next->blob)
01440     {
01441       DestroyBlob(images->next);
01442       images->next->blob=ReferenceBlob(images->blob);
01443     }
01444   images->next->compression=images->compression;
01445   images->next->endian=images->endian;
01446   return(images->next);
01447 }