]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/list.c
Update web pages
[imagemagick] / MagickCore / list.c
index 598eff10b4aa72fc0fcf50ef7caecb4337ebcd51..04c7c0632a5c19e770f6c484079719389c43e901 100644 (file)
 %                        MagickCore Image List Methods                        %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                               December 2002                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2015 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  %
@@ -83,7 +83,7 @@ MagickExport void AppendImageToList(Image **images,const Image *append)
   assert(images != (Image **) NULL);
   if (append == (Image *) NULL)
     return;
-  assert(append->signature == MagickSignature);
+  assert(append->signature == MagickCoreSignature);
   if (append->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",append->filename);
   if ((*images) == (Image *) NULL)
@@ -91,7 +91,7 @@ MagickExport void AppendImageToList(Image **images,const Image *append)
       *images=(Image *) append;
       return;
     }
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   p=GetLastImageInList(*images);
   q=GetFirstImageInList(append);
   p->next=q;
@@ -133,7 +133,7 @@ MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
 
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   while (images->previous != (Image *) NULL)
     images=images->previous;
   image=(Image *) NULL;
@@ -221,12 +221,12 @@ MagickExport Image *CloneImages(const Image *images,const char *scenes,
     length;
 
   assert(images != (const Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   assert(scenes != (char *) NULL);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   assert(exception != (ExceptionInfo *) NULL);
-  assert(exception->signature == MagickSignature);
+  assert(exception->signature == MagickCoreSignature);
   clone_images=NewImageList();
   images=GetFirstImageInList(images);
   length=GetImageListLength(images);
@@ -357,13 +357,13 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
     length;
 
   assert(images != (Image **) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   assert(scenes != (char *) NULL);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
   assert(exception != (ExceptionInfo *) NULL);
-  assert(exception->signature == MagickSignature);
+  assert(exception->signature == MagickCoreSignature);
   *images=GetFirstImageInList(*images);
   length=GetImageListLength(*images);
   delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
@@ -382,7 +382,7 @@ MagickExport void DeleteImages(Image **images,const char *scenes,
   */
   for (p=(char *) scenes; *p != '\0';)
   {
-    while ((isspace((int) *p) != 0) || (*p == ','))
+    while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
       p++;
     first=strtol(p,&p,10);
     if (first < 0)
@@ -444,7 +444,7 @@ MagickExport Image *DestroyImageList(Image *images)
 {
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   while (images != (Image *) NULL)
@@ -502,12 +502,12 @@ MagickExport Image *DuplicateImages(Image *images,
     Duplicate images.
   */
   assert(images != (Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   assert(scenes != (char *) NULL);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   assert(exception != (ExceptionInfo *) NULL);
-  assert(exception->signature == MagickSignature);
+  assert(exception->signature == MagickCoreSignature);
   duplicate_images=NewImageList();
   for (i=0; i < (ssize_t) number_duplicates; i++)
   {
@@ -546,7 +546,7 @@ MagickExport Image *GetFirstImageInList(const Image *images)
 
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
   return((Image *) p);
 }
@@ -562,7 +562,15 @@ MagickExport Image *GetFirstImageInList(const Image *images)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetImageFromList() returns an image at the specified offset from the list.
+%  GetImageFromList() returns an image at the specified index from the image
+%  list. Starting with 0 as the first image in the list.
+%
+%  A negative offset will return the image from the end of the list, such that
+%  an index of -1 is the last image.
+%
+%  If no such image exists at the specified offset a NULL image pointer is
+%  returned.  This will only happen if index is less that the negative of
+%  the list length, or larger than list length -1.  EG: ( -N to N-1 )
 %
 %  The format of the GetImageFromList method is:
 %
@@ -583,25 +591,32 @@ MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
   register ssize_t
     i;
 
-  size_t
-    length;
-
-  ssize_t
-    offset;
-
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
-  for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
-  length=GetImageListLength(images);
-  for (offset=index; offset < 0; offset+=(ssize_t) length) ;
-  for (i=0; p != (Image *) NULL; p=p->next)
-    if (i++ == (ssize_t) (offset % length))
-      break;
-  if (p == (Image *) NULL)
-    return((Image *) NULL);
+
+  /*
+    Designed to efficiently find first image (index == 0), or last image
+    (index == -1) as appropriate, without to go through the whole image list.
+    That is it tries to avoid 'counting the whole list' to  handle the
+    most common image indexes.
+  */
+  if ( index < 0 )
+    {
+      p=GetLastImageInList(images);
+      for (i=-1; p != (Image *) NULL; p=p->previous)
+        if (i-- == index)
+          break;
+    }
+  else
+    {
+      p=GetFirstImageInList(images);
+      for (i=0; p != (Image *) NULL; p=p->next)
+        if (i++ == index)
+          break;
+    }
   return((Image *) p);
 }
 \f
@@ -634,7 +649,7 @@ MagickExport ssize_t GetImageIndexInList(const Image *images)
 
   if (images == (const Image *) NULL)
     return(-1);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   for (i=0; images->previous != (Image *) NULL; i++)
     images=images->previous;
   return(i);
@@ -670,11 +685,10 @@ MagickExport size_t GetImageListLength(const Image *images)
 
   if (images == (Image *) NULL)
     return(0);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
-  while (images->next != (Image *) NULL)
-    images=images->next;
+  images=GetLastImageInList(images);
   for (i=0; images != (Image *) NULL; images=images->previous)
     i++;
   return((size_t) i);
@@ -709,7 +723,7 @@ MagickExport Image *GetLastImageInList(const Image *images)
 
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   for (p=images; p->next != (Image *) NULL; p=p->next) ;
   return((Image *) p);
 }
@@ -740,7 +754,7 @@ MagickExport Image *GetNextImageInList(const Image *images)
 {
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   return(images->next);
@@ -772,7 +786,7 @@ MagickExport Image *GetPreviousImageInList(const Image *images)
 {
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   return(images->previous);
 }
 \f
@@ -820,7 +834,7 @@ MagickExport Image **ImageListToArray(const Image *images,
 
   if (images == (Image *) NULL)
     return((Image **) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
   group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
@@ -871,12 +885,12 @@ MagickExport void InsertImageInList(Image **images,Image *insert)
 
   assert(images != (Image **) NULL);
   assert(insert != (Image *) NULL);
-  assert(insert->signature == MagickSignature);
+  assert(insert->signature == MagickCoreSignature);
   if (insert->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",insert->filename);
   if ((*images) == (Image *) NULL)
     return;
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   split=SplitImageList(*images);
   AppendImageToList(images,insert);
   AppendImageToList(images,split);
@@ -929,10 +943,14 @@ MagickExport Image *NewImageList(void)
 %    o image: the image.
 %
 */
-MagickExport void PrependImageToList(Image **images,Image *image)
+MagickExport void PrependImageToList(Image **images,Image *prepend)
 {
-  /* prepend, append the two lists with order swapped! */
-  AppendImageToList(&image,*images);
+  if (*images == (Image *) NULL)
+    {
+      *images=prepend;
+      return;
+    }
+  AppendImageToList(&prepend,*images);
 }
 \f
 /*
@@ -969,7 +987,7 @@ MagickExport Image *RemoveImageFromList(Image **images)
   assert(images != (Image **) NULL);
   if ((*images) == (Image *) NULL)
     return((Image *) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
@@ -1028,7 +1046,7 @@ MagickExport Image *RemoveFirstImageFromList(Image **images)
   assert(images != (Image **) NULL);
   if ((*images) == (Image *) NULL)
     return((Image *) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
@@ -1079,7 +1097,7 @@ MagickExport Image *RemoveLastImageFromList(Image **images)
   assert(images != (Image **) NULL);
   if ((*images) == (Image *) NULL)
     return((Image *) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
@@ -1128,12 +1146,12 @@ MagickExport void ReplaceImageInList(Image **images,Image *replace)
 {
   assert(images != (Image **) NULL);
   assert(replace != (Image *) NULL);
-  assert(replace->signature == MagickSignature);
+  assert(replace->signature == MagickCoreSignature);
   if (replace->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
   if ((*images) == (Image *) NULL)
     return;
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
 
   /* link next pointer */
   replace=GetLastImageInList(replace);
@@ -1186,12 +1204,12 @@ MagickExport void ReplaceImageInListReturnLast(Image **images,Image *replace)
 {
   assert(images != (Image **) NULL);
   assert(replace != (Image *) NULL);
-  assert(replace->signature == MagickSignature);
+  assert(replace->signature == MagickCoreSignature);
   if (replace->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
   if ((*images) == (Image *) NULL)
     return;
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
 
   /* link previous pointer */
   replace=GetFirstImageInList(replace);
@@ -1244,7 +1262,7 @@ MagickExport void ReverseImageList(Image **images)
   assert(images != (Image **) NULL);
   if ((*images) == (Image *) NULL)
     return;
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
@@ -1298,10 +1316,10 @@ MagickExport Image *SpliceImageIntoList(Image **images,
 
   assert(images != (Image **) NULL);
   assert(splice != (Image *) NULL);
-  assert(splice->signature == MagickSignature);
+  assert(splice->signature == MagickCoreSignature);
   if ((*images) == (Image *) NULL)
     return((Image *) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   if ((*images)->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       (*images)->filename);
@@ -1377,7 +1395,7 @@ MagickExport void SyncImageList(Image *images)
 
   if (images == (Image *) NULL)
     return;
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   for (p=images; p != (Image *) NULL; p=p->next)
   {
     for (q=p->next; q != (Image *) NULL; q=q->next)
@@ -1419,7 +1437,7 @@ MagickExport Image *SyncNextImageInList(const Image *images)
 {
   if (images == (Image *) NULL)
     return((Image *) NULL);
-  assert(images->signature == MagickSignature);
+  assert(images->signature == MagickCoreSignature);
   if (images->next == (Image *) NULL)
     return((Image *) NULL);
   if (images->blob != images->next->blob)