]> granicus.if.org Git - imagemagick/blobdiff - magick/list.c
(no commit message)
[imagemagick] / magick / list.c
index 7adb8408143211a9bc59c0df8f0bb692c99ac0f1..98c9a85a43e875b11711b813cfaed2ccebd0847b 100644 (file)
@@ -17,7 +17,7 @@
 %                               December 2002                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -209,7 +209,7 @@ MagickExport Image *CloneImages(const Image *images,const char *scenes,
     *clone_images,
     *image;
 
-  ssize_t
+  long
     first,
     last,
     step;
@@ -236,7 +236,7 @@ MagickExport Image *CloneImages(const Image *images,const char *scenes,
       p++;
     first=strtol(p,&p,10);
     if (first < 0)
-      first+=(ssize_t) length;
+      first+=(long) length;
     last=first;
     while (isspace((int) ((unsigned char) *p)) != 0)
       p++;
@@ -244,14 +244,14 @@ MagickExport Image *CloneImages(const Image *images,const char *scenes,
       {
         last=strtol(p+1,&p,10);
         if (last < 0)
-          last+=(ssize_t) length;
+          last+=(long) length;
       }
     for (step=first > last ? -1 : 1; first != (last+step); first+=step)
     {
       i=0;
       for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
       {
-        if (i == first)
+        if (i == (ssize_t) first)
           {
             image=CloneImage(next,0,0,MagickTrue,exception);
             if (image == (Image *) NULL)
@@ -318,7 +318,7 @@ MagickExport void DeleteImageFromList(Image **images)
 %  of images in list are ignored.
 %
 %  If the referenced images are in the reverse order, that range will be
-%  completely ignored.  Unlike CloneImages().
+%  completely ignored, unlike CloneImages().
 %
 %  The format of the DeleteImages method is:
 %
@@ -343,7 +343,7 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
   Image
     *image;
 
-  ssize_t
+  long
     first,
     last;
 
@@ -382,11 +382,11 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
   */
   for (p=(char *) scenes; *p != '\0';)
   {
-    while ((isspace((int)*p) != 0) || (*p == ','))
+    while ((isspace((int) *p) != 0) || (*p == ','))
       p++;
     first=strtol(p,&p,10);
     if (first < 0)
-      first+=(ssize_t) length;
+      first+=(long) length;
     last=first;
     while (isspace((int) ((unsigned char) *p)) != 0)
       p++;
@@ -394,11 +394,11 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
       {
         last=strtol(p+1,&p,10);
         if (last < 0)
-          last+=(ssize_t) length;
+          last+=(long) length;
       }
     if (first > last)
       continue;
-    for (i=first; i <= last; i++)
+    for (i=(ssize_t) first; i <= (ssize_t) last; i++)
       if ((i >= 0) && (i < (ssize_t) length))
         delete_list[i]=MagickTrue;
   }
@@ -457,6 +457,71 @@ MagickExport Image *DestroyImageList(Image *images)
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   D u p l i c a t e I m a g e s                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  DuplicateImages() duplicates one or more images from an image sequence,
+%  using a count and a comma separated list of image numbers or ranges.
+%
+%  The numbers start at 0 for the first image, while negative numbers refer to
+%  images starting counting from the end of the range. Images may be refered to
+%  multiple times without problems. Image refered beyond the available number
+%  of images in list are ignored.
+%
+%  The format of the DuplicateImages method is:
+%
+%      Image *DuplicateImages(Image *images,const size_t number_duplicates,
+%        const char *scenes,ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o images: the image sequence.
+%
+%    o number_duplicates: duplicate the image sequence this number of times.
+%
+%    o scenes: This character string specifies which scenes to duplicate (e.g.
+%      1,3-5,-2-6,2).
+%
+%    o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *DuplicateImages(Image *images,
+  const size_t number_duplicates,const char *scenes,ExceptionInfo *exception)
+{
+  Image
+    *clone_images,
+    *duplicate_images;
+
+  register ssize_t
+    i;
+
+  /*
+    Duplicate images.
+  */
+  assert(images != (Image *) NULL);
+  assert(images->signature == MagickSignature);
+  assert(scenes != (char *) NULL);
+  if (images->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
+  duplicate_images=NewImageList();
+  for (i=0; i < (ssize_t) number_duplicates; i++)
+  {
+    clone_images=CloneImages(images,scenes,exception);
+    AppendImageToList(&duplicate_images,clone_images);
+  }
+  return(duplicate_images);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   G e t F i r s t I m a g e I n L i s t                                     %
 %                                                                             %
 %                                                                             %
@@ -512,9 +577,6 @@ MagickExport Image *GetFirstImageInList(const Image *images)
 */
 MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
 {
-  ssize_t
-    offset;
-
   register const Image
     *p;
 
@@ -524,6 +586,9 @@ MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
   size_t
     length;
 
+  ssize_t
+    offset;
+
   if (images == (Image *) NULL)
     return((Image *) NULL);
   assert(images->signature == MagickSignature);
@@ -782,7 +847,7 @@ MagickExport Image **ImageListToArray(const Image *images,
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
 %  InsertImageInList() inserts the second image or image list into the first
-%  image list immediatally after the image pointed to.  The given image list
+%  image list immediately after the image pointed to.  The given image list
 %  pointer is unchanged unless previously empty.
 %
 %  The format of the InsertImageInList method is:
@@ -1038,8 +1103,9 @@ MagickExport Image *RemoveLastImageFromList(Image **images)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  ReplaceImageInList() replaces an image in the list. Old image is destroyed.
-%  The given image list pointer is set to point to the just inserted image.
+%  ReplaceImageInList() replaces an image in the list with the given image, or
+%  list of images.  Old image is destroyed.  The image list pointer is set to
+%  point to the first image of the inserted list of images.
 %
 %  The format of the ReplaceImageInList method is:
 %
@@ -1047,9 +1113,9 @@ MagickExport Image *RemoveLastImageFromList(Image **images)
 %
 %  A description of each parameter follows:
 %
-%    o images: the image list.
+%    o images: the list and pointer to image to replace
 %
-%    o image: the image.
+%    o image: the image or image list replacing the original
 %
 */
 MagickExport void ReplaceImageInList(Image **images,Image *image)
@@ -1062,12 +1128,76 @@ MagickExport void ReplaceImageInList(Image **images,Image *image)
   if ((*images) == (Image *) NULL)
     return;
   assert((*images)->signature == MagickSignature);
+
+  /* link next pointer */
+  image=GetLastImageInList(image);
   image->next=(*images)->next;
   if (image->next != (Image *) NULL)
     image->next->previous=image;
+
+  /* link previous pointer - set image position to first replacement image */
+  image=GetFirstImageInList(image);
+  image->previous=(*images)->previous;
+  if (image->previous != (Image *) NULL)
+    image->previous->next=image;
+
+  /* destroy replaced image */
+  (void) DestroyImage(*images);
+  (*images)=image;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   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                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except
+%  the image pointer is set to the last image in the list.
+%
+%  This allows you to simply use 'next' to go to the image that follows the
+%  just replaced image.
+%
+%  The format of the ReplaceImageInList method is:
+%
+%      ReplaceImageInListReturnLast(Image **images,Image *image)
+%
+%  A description of each parameter follows:
+%
+%    o images: the list and pointer to image to replace
+%
+%    o image: the image or image list replacing the original
+%
+*/
+MagickExport void ReplaceImageInListReturnLast(Image **images,Image *image)
+{
+  assert(images != (Image **) NULL);
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  if (image->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+  if ((*images) == (Image *) NULL)
+    return;
+  assert((*images)->signature == MagickSignature);
+
+  /* link previous pointer */
+  image=GetFirstImageInList(image);
   image->previous=(*images)->previous;
   if (image->previous != (Image *) NULL)
     image->previous->next=image;
+
+  /* link next pointer - set image position to last replacement image */
+  image=GetLastImageInList(image);
+  image->next=(*images)->next;
+  if (image->next != (Image *) NULL)
+    image->next->previous=image;
+
+  /* destroy replaced image */
   (void) DestroyImage(*images);
   (*images)=image;
 }