|
MagickCore
6.7.5
|
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 }