% December 2002 %
% %
% %
-% Copyright 1999-2009 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 %
q=GetFirstImageInList(image);
p->next=q;
q->previous=p;
- SyncImageList(*images);
}
\f
/*
last,
step;
- register long
+ register ssize_t
i;
size_t
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)
% 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:
%
MagickBooleanType
*delete_list;
- register long
+ register ssize_t
i;
size_t
return;
}
image=(*images);
- for (i=0; i < (long) length; i++)
+ for (i=0; i < (ssize_t) length; i++)
delete_list[i]=MagickFalse;
/*
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)
}
if (first > last)
continue;
- for (i=first; i <= last; i++)
- if ((i >= 0) && (i < (long) length))
+ for (i=(ssize_t) first; i <= (ssize_t) last; i++)
+ if ((i >= 0) && (i < (ssize_t) length))
delete_list[i]=MagickTrue;
}
/*
Delete images marked for deletion, once only
*/
image=(*images);
- for (i=0; i < (long) length; i++)
+ for (i=0; i < (ssize_t) length; i++)
{
*images=image;
image=GetNextImageInList(image);
% %
% %
% %
+% 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 %
% %
% %
%
% The format of the GetImageFromList method is:
%
-% Image *GetImageFromList(const Image *images,const long index)
+% Image *GetImageFromList(const Image *images,const ssize_t index)
%
% A description of each parameter follows:
%
% o index: the position within the list.
%
*/
-MagickExport Image *GetImageFromList(const Image *images,const long index)
+MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
{
- long
- offset;
-
register const Image
*p;
- register long
+ register ssize_t
i;
size_t
length;
+ ssize_t
+ offset;
+
if (images == (Image *) NULL)
return((Image *) NULL);
assert(images->signature == MagickSignature);
(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+=(long) length) ;
+ for (offset=index; offset < 0; offset+=(ssize_t) length) ;
for (i=0; p != (Image *) NULL; p=p->next)
- if (i++ == (long) (offset % length))
+ if (i++ == (ssize_t) (offset % length))
break;
if (p == (Image *) NULL)
return((Image *) NULL);
%
% The format of the GetImageIndexInList method is:
%
-% long GetImageIndexInList(const Image *images)
+% ssize_t GetImageIndexInList(const Image *images)
%
% A description of each parameter follows:
%
% o images: the image list.
%
*/
-MagickExport long GetImageIndexInList(const Image *images)
+MagickExport ssize_t GetImageIndexInList(const Image *images)
{
- register long
+ register ssize_t
i;
if (images == (const Image *) NULL)
%
% The format of the GetImageListLength method is:
%
-% unsigned long GetImageListLength(const Image *images)
+% size_t GetImageListLength(const Image *images)
%
% A description of each parameter follows:
%
% o images: the image list.
%
*/
-MagickExport unsigned long GetImageListLength(const Image *images)
+MagickExport size_t GetImageListLength(const Image *images)
{
- register long
+ register ssize_t
i;
if (images == (Image *) NULL)
images=images->previous;
for (i=0; images != (Image *) NULL; images=images->next)
i++;
- return((unsigned long) i);
+ return((size_t) i);
}
\f
/*
Image
**group;
- register long
+ register ssize_t
i;
if (images == (Image *) NULL)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 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:
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% 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:
%
%
% 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)
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;
}
%
% The format of the SpliceImageIntoList method is:
%
-% SpliceImageIntoList(Image **images,const unsigned long,
+% SpliceImageIntoList(Image **images,const size_t,
% const Image *splice)
%
% A description of each parameter follows:
%
*/
MagickExport Image *SpliceImageIntoList(Image **images,
- const unsigned long length,const Image *splice)
+ const size_t length,const Image *splice)
{
Image
*image,
*split;
- register unsigned long
+ register size_t
i;
assert(images != (Image **) NULL);
DestroyBlob(images->next);
images->next->blob=ReferenceBlob(images->blob);
}
+ images->next->compression=images->compression;
images->next->endian=images->endian;
return(images->next);
}