]> granicus.if.org Git - imagemagick/blobdiff - magick/list.c
(no commit message)
[imagemagick] / magick / list.c
index ccbfae5a22098885fbe71a709cfd4732017fb955..98c9a85a43e875b11711b813cfaed2ccebd0847b 100644 (file)
@@ -276,7 +276,7 @@ MagickExport Image *CloneImages(const Image *images,const char *scenes,
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  DeleteImageFromList() duplicates an image from the list. List pointer
+%  DeleteImageFromList() deletes an image from the list. List pointer
 %  is moved to the next image, if one is present. See RemoveImageFromList().
 %
 %  The format of the DeleteImageFromList method is:
@@ -309,7 +309,7 @@ MagickExport void DeleteImageFromList(Image **images)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  DeleteImages() duplicates one or more images from an image sequence, using a
+%  DeleteImages() deletes one or more images from an image sequence, using a
 %  comma separated list of image numbers or ranges.
 %
 %  The numbers start at 0 for the first image, while negative numbers refer to
@@ -328,7 +328,7 @@ MagickExport void DeleteImageFromList(Image **images)
 %
 %    o images: the image sequence.
 %
-%    o scenes: This character string specifies which scenes to duplicate
+%    o scenes: This character string specifies which scenes to delete
 %      (e.g. 1,3-5,-2-6,2).
 %
 %    o exception: return any errors or warnings in this structure.
@@ -348,7 +348,7 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
     last;
 
   MagickBooleanType
-    *duplicate_list;
+    *delete_list;
 
   register ssize_t
     i;
@@ -366,9 +366,9 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
   assert(exception->signature == MagickSignature);
   *images=GetFirstImageInList(*images);
   length=GetImageListLength(*images);
-  duplicate_list=(MagickBooleanType *) AcquireQuantumMemory(length,
-    sizeof(*duplicate_list));
-  if (duplicate_list == (MagickBooleanType *) NULL)
+  delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
+    sizeof(*delete_list));
+  if (delete_list == (MagickBooleanType *) NULL)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),
         ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
@@ -376,13 +376,13 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
     }
   image=(*images);
   for (i=0; i < (ssize_t) length; i++)
-    duplicate_list[i]=MagickFalse;
+    delete_list[i]=MagickFalse;
   /*
-    Note which images will be duplicated, avoid duplicate duplicated
+    Note which images will be deleted, avoid duplicate deleted
   */
   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)
@@ -400,7 +400,7 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
       continue;
     for (i=(ssize_t) first; i <= (ssize_t) last; i++)
       if ((i >= 0) && (i < (ssize_t) length))
-        duplicate_list[i]=MagickTrue;
+        delete_list[i]=MagickTrue;
   }
   /*
     Delete images marked for deletion, once only
@@ -410,11 +410,11 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
   {
     *images=image;
     image=GetNextImageInList(image);
-    if (duplicate_list[i] != MagickFalse)
+    if (delete_list[i] != MagickFalse)
       DeleteImageFromList(images);
 
   }
-  (void) RelinquishMagickMemory(duplicate_list);
+  (void) RelinquishMagickMemory(delete_list);
   *images=GetFirstImageInList(*images);
 }
 \f
@@ -471,36 +471,32 @@ MagickExport Image *DestroyImageList(Image *images)
 %  multiple times without problems. Image refered beyond the available number
 %  of images in list are ignored.
 %
-%  If the referenced images are in the reverse order, that range will be
-%  completely ignored, unlike CloneImages().
-%
 %  The format of the DuplicateImages method is:
 %
-%      Image *DuplicateImages(Image *images,const char *scenes,
-%        ExceptionInfo *exception)
+%      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 scenes: This character string specifies the count and which scenes to
-%      duplicate (e.g. 2,1,3-5,-2-6,2).
+%    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 char *scenes,
-  ExceptionInfo *exception)
+MagickExport Image *DuplicateImages(Image *images,
+  const size_t number_duplicates,const char *scenes,ExceptionInfo *exception)
 {
-  char
-    *p;
-
   Image
     *clone_images,
     *duplicate_images;
 
-  ssize_t
-    count;
+  register ssize_t
+    i;
 
   /*
     Duplicate images.
@@ -512,18 +508,12 @@ MagickExport Image *DuplicateImages(Image *images,const char *scenes,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  p=(char *) scenes;
-  while ((isspace((int)*p) != 0) || (*p == ','))
-    p++;
-  count=(ssize_t) strtol(p,&p,10);
   duplicate_images=NewImageList();
-  while (count-- > 0)
+  for (i=0; i < (ssize_t) number_duplicates; i++)
   {
-    clone_images=CloneImages(images,p,exception);
+    clone_images=CloneImages(images,scenes,exception);
     AppendImageToList(&duplicate_images,clone_images);
   }
-  if (duplicate_images == (Image *) NULL)
-    duplicate_images=CloneImages(images,"0",exception);
   return(duplicate_images);
 }
 \f
@@ -917,60 +907,6 @@ MagickExport Image *NewImageList(void)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+   P a g e I n d e x I m a g e L i s t                                       %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  PageIndexImageList() synchronizes the page_index and page_total values
-%  in the image list.
-%
-%  These values are used by InterpretImageProperties() to set %p and %n
-%  percent escapes. The value is preserved, even if the image is later removed
-%  from the list using RemoveFirstImageFromList() for individual image
-%  processing.
-%
-%  The format of the PageIndexImageList method is:
-%
-%      void PageIndexImageList(Image *images)
-%
-%  A description of each parameter follows:
-%
-%    o images: the image list.
-%
-*/
-MagickExport void PageIndexImageList(Image *images)
-{
-  register ssize_t
-    p,n;
-
-  if (images == (Image *) NULL)
-    return;
-  assert(images->signature == MagickSignature);
-  if (images->debug != MagickFalse)
-    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
-
-  /* find start for image counting */
-  while (images->previous != (Image *) NULL)
-    images=images->previous;
-
-  /* count up images - find end */
-  n=1;
-  while (images->next != (Image *) NULL)
-    images=images->next, n++;
-
-  /* set page_index and page_total attributes */
-  p=n-1;
-  for (; images != (Image *) NULL; images=images->previous)
-    images->page_index=p--, images->page_total=(size_t) n;
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
 %   P r e p e n d I m a g e T o L i s t                                       %
 %                                                                             %
 %                                                                             %
@@ -1167,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:
 %
@@ -1176,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)
@@ -1191,14 +1128,76 @@ MagickExport void ReplaceImageInList(Image **images,Image *image)
   if ((*images) == (Image *) NULL)
     return;
   assert((*images)->signature == MagickSignature);
-  for ( ; image->next != (Image *) NULL; image=image->next) ;
+
+  /* link next pointer */
+  image=GetLastImageInList(image);
   image->next=(*images)->next;
   if (image->next != (Image *) NULL)
     image->next->previous=image;
-  for ( ; image->previous != (Image *) NULL; image=image->previous) ;
+
+  /* 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;
 }