PageRenderTime 29ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/MagickCore/list.c

https://gitlab.com/ImageMagick/ImageMagick
C | 1474 lines | 652 code | 42 blank | 780 comment | 280 complexity | 1bdb0a037c0fe3c161f1ff5258760734 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % %
  4. % %
  5. % %
  6. % L IIIII SSSSS TTTTT %
  7. % L I SS T %
  8. % L I SSS T %
  9. % L I SS T %
  10. % LLLLL IIIII SSSSS T %
  11. % %
  12. % %
  13. % MagickCore Image List Methods %
  14. % %
  15. % Software Design %
  16. % Cristy %
  17. % December 2002 %
  18. % %
  19. % %
  20. % Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization %
  21. % dedicated to making software imaging solutions freely available. %
  22. % %
  23. % You may not use this file except in compliance with the License. You may %
  24. % obtain a copy of the License at %
  25. % %
  26. % https://imagemagick.org/script/license.php %
  27. % %
  28. % Unless required by applicable law or agreed to in writing, software %
  29. % distributed under the License is distributed on an "AS IS" BASIS, %
  30. % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
  31. % See the License for the specific language governing permissions and %
  32. % limitations under the License. %
  33. % %
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. %
  36. %
  37. %
  38. */
  39. /*
  40. Include declarations.
  41. */
  42. #include "MagickCore/studio.h"
  43. #include "MagickCore/blob.h"
  44. #include "MagickCore/blob-private.h"
  45. #include "MagickCore/exception.h"
  46. #include "MagickCore/exception-private.h"
  47. #include "MagickCore/image-private.h"
  48. #include "MagickCore/list.h"
  49. #include "MagickCore/memory_.h"
  50. #include "MagickCore/string_.h"
  51. /*
  52. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  53. % %
  54. % %
  55. % %
  56. % A p p e n d I m a g e T o L i s t %
  57. % %
  58. % %
  59. % %
  60. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  61. %
  62. % AppendImageToList() appends the second image list to the end of the first
  63. % list. The given image list pointer is left unchanged, unless it was empty.
  64. %
  65. % The format of the AppendImageToList method is:
  66. %
  67. % AppendImageToList(Image *images,const Image *image)
  68. %
  69. % A description of each parameter follows:
  70. %
  71. % o images: the image list to be appended to.
  72. %
  73. % o image: the appended image or image list.
  74. %
  75. */
  76. MagickExport void AppendImageToList(Image **images,const Image *append)
  77. {
  78. register Image
  79. *p,
  80. *q;
  81. assert(images != (Image **) NULL);
  82. if (append == (Image *) NULL)
  83. return;
  84. assert(append->signature == MagickCoreSignature);
  85. if (append->debug != MagickFalse)
  86. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",append->filename);
  87. if ((*images) == (Image *) NULL)
  88. {
  89. *images=(Image *) append;
  90. return;
  91. }
  92. assert((*images)->signature == MagickCoreSignature);
  93. p=GetLastImageInList(*images);
  94. q=GetFirstImageInList(append);
  95. p->next=q;
  96. q->previous=p;
  97. }
  98. /*
  99. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  100. % %
  101. % %
  102. % %
  103. % C l o n e I m a g e L i s t %
  104. % %
  105. % %
  106. % %
  107. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  108. %
  109. % CloneImageList() returns a duplicate of the image list.
  110. %
  111. % The format of the CloneImageList method is:
  112. %
  113. % Image *CloneImageList(const Image *images,ExceptionInfo *exception)
  114. %
  115. % A description of each parameter follows:
  116. %
  117. % o images: the image list.
  118. %
  119. % o exception: return any errors or warnings in this structure.
  120. %
  121. */
  122. MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
  123. {
  124. Image
  125. *clone,
  126. *image;
  127. register Image
  128. *p;
  129. if (images == (Image *) NULL)
  130. return((Image *) NULL);
  131. assert(images->signature == MagickCoreSignature);
  132. while (images->previous != (Image *) NULL)
  133. {
  134. assert(images != images->previous);
  135. images=images->previous;
  136. }
  137. image=(Image *) NULL;
  138. for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
  139. {
  140. assert(images != images->next);
  141. clone=CloneImage(images,0,0,MagickTrue,exception);
  142. if (clone == (Image *) NULL)
  143. {
  144. if (image != (Image *) NULL)
  145. image=DestroyImageList(image);
  146. return((Image *) NULL);
  147. }
  148. if (image == (Image *) NULL)
  149. {
  150. image=clone;
  151. p=image;
  152. continue;
  153. }
  154. p->next=clone;
  155. clone->previous=p;
  156. p=p->next;
  157. }
  158. return(image);
  159. }
  160. /*
  161. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  162. % %
  163. % %
  164. % %
  165. % C l o n e I m a g e s %
  166. % %
  167. % %
  168. % %
  169. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  170. %
  171. % CloneImages() clones one or more images from an image sequence, using a
  172. % comma separated list of image numbers or ranges.
  173. %
  174. % The numbers start at 0 for the first image in the list, while negative
  175. % numbers refer to images starting counting from the end of the range. Images
  176. % may be referred to multiple times to clone them multiple times. Images
  177. % referred beyond the available number of images in list are ignored.
  178. %
  179. % Images referenced may be reversed, and results in a clone of those images
  180. % also being made with a reversed order.
  181. %
  182. % The format of the CloneImages method is:
  183. %
  184. % Image *CloneImages(const Image *images,const char *scenes,
  185. % ExceptionInfo *exception)
  186. %
  187. % A description of each parameter follows:
  188. %
  189. % o images: the image sequence.
  190. %
  191. % o scenes: This character string specifies which scenes to clone
  192. % (e.g. 1,3-5,7-3,2).
  193. %
  194. % o exception: return any errors or warnings in this structure.
  195. %
  196. */
  197. MagickExport Image *CloneImages(const Image *images,const char *scenes,
  198. ExceptionInfo *exception)
  199. {
  200. char
  201. *p;
  202. const Image
  203. *next;
  204. Image
  205. *clone_images,
  206. *image;
  207. register ssize_t
  208. i;
  209. size_t
  210. length;
  211. ssize_t
  212. first,
  213. last,
  214. step;
  215. assert(images != (const Image *) NULL);
  216. assert(images->signature == MagickCoreSignature);
  217. assert(scenes != (char *) NULL);
  218. if (images->debug != MagickFalse)
  219. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  220. assert(exception != (ExceptionInfo *) NULL);
  221. assert(exception->signature == MagickCoreSignature);
  222. clone_images=NewImageList();
  223. images=GetFirstImageInList(images);
  224. length=GetImageListLength(images);
  225. for (p=(char *) scenes; *p != '\0';)
  226. {
  227. MagickBooleanType
  228. match;
  229. while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
  230. p++;
  231. first=(ssize_t) strtol(p,&p,10);
  232. if (first < 0)
  233. first+=(ssize_t) length;
  234. else
  235. if (first > (ssize_t) length)
  236. first=(ssize_t) length;
  237. last=first;
  238. while (isspace((int) ((unsigned char) *p)) != 0)
  239. p++;
  240. if (*p == '-')
  241. {
  242. last=(ssize_t) strtol(p+1,&p,10);
  243. if (last < 0)
  244. last+=(ssize_t) length;
  245. else
  246. if (last > (ssize_t) length)
  247. last=(ssize_t) length;
  248. }
  249. match=MagickFalse;
  250. step=(ssize_t) (first > last ? -1 : 1);
  251. for ( ; first != (last+step); first+=step)
  252. {
  253. i=0;
  254. for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
  255. {
  256. if (i == (ssize_t) first)
  257. {
  258. image=CloneImage(next,0,0,MagickTrue,exception);
  259. if (image == (Image *) NULL)
  260. break;
  261. AppendImageToList(&clone_images,image);
  262. match=MagickTrue;
  263. }
  264. i++;
  265. }
  266. if (match == MagickFalse)
  267. (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
  268. "InvalidImageIndex","`%s'",images->filename);
  269. }
  270. }
  271. return(GetFirstImageInList(clone_images));
  272. }
  273. /*
  274. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  275. % %
  276. % %
  277. % %
  278. % D e l e t e I m a g e F r o m L i s t %
  279. % %
  280. % %
  281. % %
  282. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  283. %
  284. % DeleteImageFromList() deletes an image from the list. List pointer
  285. % is moved to the next image, if one is present. See RemoveImageFromList().
  286. %
  287. % The format of the DeleteImageFromList method is:
  288. %
  289. % DeleteImageFromList(Image **images)
  290. %
  291. % A description of each parameter follows:
  292. %
  293. % o images: the image list.
  294. %
  295. */
  296. MagickExport void DeleteImageFromList(Image **images)
  297. {
  298. Image
  299. *image;
  300. image=RemoveImageFromList(images);
  301. if (image != (Image *) NULL)
  302. (void) DestroyImage(image);
  303. }
  304. /*
  305. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  306. % %
  307. % %
  308. % %
  309. % D e l e t e I m a g e s %
  310. % %
  311. % %
  312. % %
  313. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  314. %
  315. % DeleteImages() deletes one or more images from an image sequence, using a
  316. % comma separated list of image numbers or ranges.
  317. %
  318. % The numbers start at 0 for the first image, while negative numbers refer to
  319. % images starting counting from the end of the range. Images may be referred to
  320. % multiple times without problems. Image referred beyond the available number
  321. % of images in list are ignored.
  322. %
  323. % If the referenced images are in the reverse order, that range will be
  324. % completely ignored, unlike CloneImages().
  325. %
  326. % The format of the DeleteImages method is:
  327. %
  328. % DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
  329. %
  330. % A description of each parameter follows:
  331. %
  332. % o images: the image sequence.
  333. %
  334. % o scenes: This character string specifies which scenes to delete
  335. % (e.g. 1,3-5,-2-6,2).
  336. %
  337. % o exception: return any errors or warnings in this structure.
  338. %
  339. */
  340. MagickExport void DeleteImages(Image **images,const char *scenes,
  341. ExceptionInfo *exception)
  342. {
  343. char
  344. *p;
  345. Image
  346. *image;
  347. long
  348. first,
  349. last;
  350. MagickBooleanType
  351. *delete_list;
  352. register ssize_t
  353. i;
  354. size_t
  355. length;
  356. assert(images != (Image **) NULL);
  357. assert((*images)->signature == MagickCoreSignature);
  358. assert(scenes != (char *) NULL);
  359. if ((*images)->debug != MagickFalse)
  360. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  361. (*images)->filename);
  362. assert(exception != (ExceptionInfo *) NULL);
  363. assert(exception->signature == MagickCoreSignature);
  364. *images=GetFirstImageInList(*images);
  365. length=GetImageListLength(*images);
  366. delete_list=(MagickBooleanType *) AcquireQuantumMemory(length,
  367. sizeof(*delete_list));
  368. if (delete_list == (MagickBooleanType *) NULL)
  369. {
  370. (void) ThrowMagickException(exception,GetMagickModule(),
  371. ResourceLimitError,"MemoryAllocationFailed","`%s'",(*images)->filename);
  372. return;
  373. }
  374. image=(*images);
  375. for (i=0; i < (ssize_t) length; i++)
  376. delete_list[i]=MagickFalse;
  377. /*
  378. Note which images will be deleted, avoid duplicates.
  379. */
  380. for (p=(char *) scenes; *p != '\0';)
  381. {
  382. while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
  383. p++;
  384. first=strtol(p,&p,10);
  385. if (first < 0)
  386. first+=(long) length;
  387. last=first;
  388. while (isspace((int) ((unsigned char) *p)) != 0)
  389. p++;
  390. if (*p == '-')
  391. {
  392. last=strtol(p+1,&p,10);
  393. if (last < 0)
  394. last+=(long) length;
  395. }
  396. if (first > last)
  397. continue;
  398. for (i=(ssize_t) first; i <= (ssize_t) last; i++)
  399. if ((i >= 0) && (i < (ssize_t) length))
  400. delete_list[i]=MagickTrue;
  401. }
  402. /*
  403. Delete images marked for deletion, once only.
  404. */
  405. image=(*images);
  406. for (i=0; i < (ssize_t) length; i++)
  407. {
  408. *images=image;
  409. image=GetNextImageInList(image);
  410. if (delete_list[i] != MagickFalse)
  411. DeleteImageFromList(images);
  412. }
  413. (void) RelinquishMagickMemory(delete_list);
  414. *images=GetFirstImageInList(*images);
  415. }
  416. /*
  417. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  418. % %
  419. % %
  420. % %
  421. % D e s t r o y I m a g e L i s t %
  422. % %
  423. % %
  424. % %
  425. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  426. %
  427. % DestroyImageList() destroys an image list.
  428. %
  429. % The format of the DestroyImageList method is:
  430. %
  431. % Image *DestroyImageList(Image *image)
  432. %
  433. % A description of each parameter follows:
  434. %
  435. % o image: the image sequence.
  436. %
  437. */
  438. MagickExport Image *DestroyImageList(Image *images)
  439. {
  440. if (images == (Image *) NULL)
  441. return((Image *) NULL);
  442. assert(images->signature == MagickCoreSignature);
  443. if (images->debug != MagickFalse)
  444. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  445. while (images != (Image *) NULL)
  446. DeleteImageFromList(&images);
  447. return((Image *) NULL);
  448. }
  449. /*
  450. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  451. % %
  452. % %
  453. % %
  454. % D u p l i c a t e I m a g e s %
  455. % %
  456. % %
  457. % %
  458. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  459. %
  460. % DuplicateImages() duplicates one or more images from an image sequence,
  461. % using a count and a comma separated list of image numbers or ranges.
  462. %
  463. % The numbers start at 0 for the first image, while negative numbers refer to
  464. % images starting counting from the end of the range. Images may be referred to
  465. % multiple times without problems. Image referred beyond the available number
  466. % of images in list are ignored.
  467. %
  468. % The format of the DuplicateImages method is:
  469. %
  470. % Image *DuplicateImages(Image *images,const size_t number_duplicates,
  471. % const char *scenes,ExceptionInfo *exception)
  472. %
  473. % A description of each parameter follows:
  474. %
  475. % o images: the image sequence.
  476. %
  477. % o number_duplicates: duplicate the image sequence this number of times.
  478. %
  479. % o scenes: This character string specifies which scenes to duplicate (e.g.
  480. % 1,3-5,-2-6,2).
  481. %
  482. % o exception: return any errors or warnings in this structure.
  483. %
  484. */
  485. MagickExport Image *DuplicateImages(Image *images,
  486. const size_t number_duplicates,const char *scenes,ExceptionInfo *exception)
  487. {
  488. Image
  489. *clone_images,
  490. *duplicate_images;
  491. register ssize_t
  492. i;
  493. /*
  494. Duplicate images.
  495. */
  496. assert(images != (Image *) NULL);
  497. assert(images->signature == MagickCoreSignature);
  498. assert(scenes != (char *) NULL);
  499. if (images->debug != MagickFalse)
  500. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  501. assert(exception != (ExceptionInfo *) NULL);
  502. assert(exception->signature == MagickCoreSignature);
  503. duplicate_images=NewImageList();
  504. for (i=0; i < (ssize_t) number_duplicates; i++)
  505. {
  506. clone_images=CloneImages(images,scenes,exception);
  507. AppendImageToList(&duplicate_images,clone_images);
  508. }
  509. return(duplicate_images);
  510. }
  511. /*
  512. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  513. % %
  514. % %
  515. % %
  516. % G e t F i r s t I m a g e I n L i s t %
  517. % %
  518. % %
  519. % %
  520. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  521. %
  522. % GetFirstImageInList() returns a pointer to the first image in the list.
  523. %
  524. % The format of the GetFirstImageInList method is:
  525. %
  526. % Image *GetFirstImageInList(const Image *images)
  527. %
  528. % A description of each parameter follows:
  529. %
  530. % o images: the image list.
  531. %
  532. */
  533. MagickExport Image *GetFirstImageInList(const Image *images)
  534. {
  535. register const Image
  536. *p;
  537. if (images == (Image *) NULL)
  538. return((Image *) NULL);
  539. assert(images->signature == MagickCoreSignature);
  540. for (p=images; p->previous != (Image *) NULL; p=p->previous) ;
  541. return((Image *) p);
  542. }
  543. /*
  544. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  545. % %
  546. % %
  547. % %
  548. % G e t I m a g e F r o m L i s t %
  549. % %
  550. % %
  551. % %
  552. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  553. %
  554. % GetImageFromList() returns an image at the specified index from the image
  555. % list. Starting with 0 as the first image in the list.
  556. %
  557. % A negative offset will return the image from the end of the list, such that
  558. % an index of -1 is the last image.
  559. %
  560. % If no such image exists at the specified offset a NULL image pointer is
  561. % returned. This will only happen if index is less that the negative of
  562. % the list length, or larger than list length -1. EG: ( -N to N-1 )
  563. %
  564. % The format of the GetImageFromList method is:
  565. %
  566. % Image *GetImageFromList(const Image *images,const ssize_t index)
  567. %
  568. % A description of each parameter follows:
  569. %
  570. % o images: the image list.
  571. %
  572. % o index: the position within the list.
  573. %
  574. */
  575. MagickExport Image *GetImageFromList(const Image *images,const ssize_t index)
  576. {
  577. register const Image
  578. *p;
  579. register ssize_t
  580. i;
  581. if (images == (Image *) NULL)
  582. return((Image *) NULL);
  583. assert(images->signature == MagickCoreSignature);
  584. if (images->debug != MagickFalse)
  585. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  586. if (index < 0)
  587. {
  588. p=GetLastImageInList(images);
  589. for (i=(-1); p != (Image *) NULL; p=p->previous)
  590. if (i-- == index)
  591. break;
  592. }
  593. else
  594. {
  595. p=GetFirstImageInList(images);
  596. for (i=0; p != (Image *) NULL; p=p->next)
  597. if (i++ == index)
  598. break;
  599. }
  600. return((Image *) p);
  601. }
  602. /*
  603. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  604. % %
  605. % %
  606. % %
  607. % G e t I m a g e I n d e x I n L i s t %
  608. % %
  609. % %
  610. % %
  611. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  612. %
  613. % GetImageIndexInList() returns the offset in the list of the specified image.
  614. %
  615. % The format of the GetImageIndexInList method is:
  616. %
  617. % ssize_t GetImageIndexInList(const Image *images)
  618. %
  619. % A description of each parameter follows:
  620. %
  621. % o images: the image list.
  622. %
  623. */
  624. MagickExport ssize_t GetImageIndexInList(const Image *images)
  625. {
  626. register ssize_t
  627. i;
  628. if (images == (const Image *) NULL)
  629. return(-1);
  630. assert(images->signature == MagickCoreSignature);
  631. for (i=0; images->previous != (Image *) NULL; i++)
  632. {
  633. assert(images != images->previous);
  634. images=images->previous;
  635. }
  636. return(i);
  637. }
  638. /*
  639. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  640. % %
  641. % %
  642. % %
  643. % G e t I m a g e L i s t L e n g t h %
  644. % %
  645. % %
  646. % %
  647. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  648. %
  649. % GetImageListLength() returns the length of the list (the number of images in
  650. % the list).
  651. %
  652. % The format of the GetImageListLength method is:
  653. %
  654. % size_t GetImageListLength(const Image *images)
  655. %
  656. % A description of each parameter follows:
  657. %
  658. % o images: the image list.
  659. %
  660. */
  661. MagickExport size_t GetImageListLength(const Image *images)
  662. {
  663. register ssize_t
  664. i;
  665. if (images == (Image *) NULL)
  666. return(0);
  667. assert(images->signature == MagickCoreSignature);
  668. if (images->debug != MagickFalse)
  669. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  670. images=GetLastImageInList(images);
  671. for (i=0; images != (Image *) NULL; images=images->previous)
  672. {
  673. assert(images != images->previous);
  674. i++;
  675. }
  676. return((size_t) i);
  677. }
  678. /*
  679. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  680. % %
  681. % %
  682. % %
  683. % G e t L a s t I m a g e I n L i s t %
  684. % %
  685. % %
  686. % %
  687. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  688. %
  689. % GetLastImageInList() returns a pointer to the last image in the list.
  690. %
  691. % The format of the GetLastImageInList method is:
  692. %
  693. % Image *GetLastImageInList(const Image *images)
  694. %
  695. % A description of each parameter follows:
  696. %
  697. % o images: the image list.
  698. %
  699. */
  700. MagickExport Image *GetLastImageInList(const Image *images)
  701. {
  702. register const Image
  703. *p;
  704. if (images == (Image *) NULL)
  705. return((Image *) NULL);
  706. assert(images->signature == MagickCoreSignature);
  707. for (p=images; p->next != (Image *) NULL; p=p->next) ;
  708. return((Image *) p);
  709. }
  710. /*
  711. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  712. % %
  713. % %
  714. % %
  715. % G e t N e x t I m a g e I n L i s t %
  716. % %
  717. % %
  718. % %
  719. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  720. %
  721. % GetNextImageInList() returns the next image in the list.
  722. %
  723. % The format of the GetNextImageInList method is:
  724. %
  725. % Image *GetNextImageInList(const Image *images)
  726. %
  727. % A description of each parameter follows:
  728. %
  729. % o images: the image list.
  730. %
  731. */
  732. MagickExport Image *GetNextImageInList(const Image *images)
  733. {
  734. if (images == (Image *) NULL)
  735. return((Image *) NULL);
  736. assert(images->signature == MagickCoreSignature);
  737. if (images->debug != MagickFalse)
  738. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  739. return(images->next);
  740. }
  741. /*
  742. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  743. % %
  744. % %
  745. % %
  746. % G e t P r e v i o u s I m a g e I n L i s t %
  747. % %
  748. % %
  749. % %
  750. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  751. %
  752. % GetPreviousImageInList() returns the previous image in the list.
  753. %
  754. % The format of the GetPreviousImageInList method is:
  755. %
  756. % Image *GetPreviousImageInList(const Image *images)
  757. %
  758. % A description of each parameter follows:
  759. %
  760. % o images: the image list.
  761. %
  762. */
  763. MagickExport Image *GetPreviousImageInList(const Image *images)
  764. {
  765. if (images == (Image *) NULL)
  766. return((Image *) NULL);
  767. assert(images->signature == MagickCoreSignature);
  768. return(images->previous);
  769. }
  770. /*
  771. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  772. % %
  773. % %
  774. % I m a g e L i s t T o A r r a y %
  775. % %
  776. % %
  777. % %
  778. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  779. %
  780. % ImageListToArray() is a convenience method that converts an image list to
  781. % a sequential array, with a NULL image pointer at the end of the array.
  782. %
  783. % The images remain part of the original image list, with the array providing
  784. % an alternative means of indexing the image array.
  785. %
  786. % group = ImageListToArray(images, exception);
  787. % while (i = 0; group[i] != (Image *) NULL; i++)
  788. % printf("%s\n", group[i]->filename);
  789. % printf("%d images\n", i);
  790. % group = RelinquishMagickMemory(group);
  791. %
  792. % The format of the ImageListToArray method is:
  793. %
  794. % Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
  795. %
  796. % A description of each parameter follows:
  797. %
  798. % o image: the image list.
  799. %
  800. % o exception: return any errors or warnings in this structure.
  801. %
  802. */
  803. MagickExport Image **ImageListToArray(const Image *images,
  804. ExceptionInfo *exception)
  805. {
  806. Image
  807. **group;
  808. register ssize_t
  809. i;
  810. if (images == (Image *) NULL)
  811. return((Image **) NULL);
  812. assert(images->signature == MagickCoreSignature);
  813. if (images->debug != MagickFalse)
  814. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
  815. group=(Image **) AcquireQuantumMemory((size_t) GetImageListLength(images)+1UL,
  816. sizeof(*group));
  817. if (group == (Image **) NULL)
  818. {
  819. (void) ThrowMagickException(exception,GetMagickModule(),
  820. ResourceLimitError,"MemoryAllocationFailed","`%s'",images->filename);
  821. return((Image **) NULL);
  822. }
  823. images=GetFirstImageInList(images);
  824. for (i=0; images != (Image *) NULL; images=images->next)
  825. {
  826. assert(images != images->next);
  827. group[i++]=(Image *) images;
  828. }
  829. group[i]=(Image *) NULL;
  830. return(group);
  831. }
  832. /*
  833. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  834. % %
  835. % %
  836. % %
  837. % I n s e r t I m a g e I n L i s t %
  838. % %
  839. % %
  840. % %
  841. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  842. %
  843. % InsertImageInList() insert the given image or image list, into the first
  844. % image list, immediately AFTER the image pointed to. The given image list
  845. % pointer is left unchanged unless previously empty.
  846. %
  847. % The format of the InsertImageInList method is:
  848. %
  849. % InsertImageInList(Image **images,Image *insert)
  850. %
  851. % A description of each parameter follows:
  852. %
  853. % o images: the image list to insert into.
  854. %
  855. % o insert: the image list to insert.
  856. %
  857. */
  858. MagickExport void InsertImageInList(Image **images,Image *insert)
  859. {
  860. Image
  861. *split;
  862. assert(images != (Image **) NULL);
  863. assert(insert != (Image *) NULL);
  864. assert(insert->signature == MagickCoreSignature);
  865. if (insert->debug != MagickFalse)
  866. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",insert->filename);
  867. if ((*images) == (Image *) NULL)
  868. return;
  869. assert((*images)->signature == MagickCoreSignature);
  870. split=SplitImageList(*images);
  871. AppendImageToList(images,insert);
  872. AppendImageToList(images,split);
  873. }
  874. /*
  875. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  876. % %
  877. % %
  878. % %
  879. % N e w I m a g e L i s t %
  880. % %
  881. % %
  882. % %
  883. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  884. %
  885. % NewImageList() creates an empty image list.
  886. %
  887. % The format of the NewImageList method is:
  888. %
  889. % Image *NewImageList(void)
  890. %
  891. */
  892. MagickExport Image *NewImageList(void)
  893. {
  894. return((Image *) NULL);
  895. }
  896. /*
  897. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  898. % %
  899. % %
  900. % %
  901. % P r e p e n d I m a g e T o L i s t %
  902. % %
  903. % %
  904. % %
  905. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  906. %
  907. % PrependImageToList() prepends the image to the beginning of the list.
  908. %
  909. % The format of the PrependImageToList method is:
  910. %
  911. % PrependImageToList(Image *images,Image *image)
  912. %
  913. % A description of each parameter follows:
  914. %
  915. % o images: the image list.
  916. %
  917. % o image: the image.
  918. %
  919. */
  920. MagickExport void PrependImageToList(Image **images,Image *prepend)
  921. {
  922. if (*images == (Image *) NULL)
  923. {
  924. *images=prepend;
  925. return;
  926. }
  927. AppendImageToList(&prepend,*images);
  928. }
  929. /*
  930. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  931. % %
  932. % %
  933. % %
  934. % R e m o v e I m a g e F r o m L i s t %
  935. % %
  936. % %
  937. % %
  938. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  939. %
  940. % RemoveImageFromList() removes and returns the image pointed to.
  941. %
  942. % The given image list pointer is set to point to the next image in list
  943. % if it exists, otherwise it is set to the previous image, or NULL if list
  944. % was emptied.
  945. %
  946. % The format of the RemoveImageFromList method is:
  947. %
  948. % Image *RemoveImageFromList(Image **images)
  949. %
  950. % A description of each parameter follows:
  951. %
  952. % o images: the image list.
  953. %
  954. */
  955. MagickExport Image *RemoveImageFromList(Image **images)
  956. {
  957. register Image
  958. *p;
  959. assert(images != (Image **) NULL);
  960. if ((*images) == (Image *) NULL)
  961. return((Image *) NULL);
  962. assert((*images)->signature == MagickCoreSignature);
  963. if ((*images)->debug != MagickFalse)
  964. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  965. (*images)->filename);
  966. p=(*images);
  967. if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
  968. *images=(Image *) NULL;
  969. else
  970. {
  971. if (p->previous != (Image *) NULL)
  972. {
  973. p->previous->next=p->next;
  974. *images=p->previous;
  975. }
  976. if (p->next != (Image *) NULL)
  977. {
  978. p->next->previous=p->previous;
  979. *images=p->next;
  980. }
  981. p->previous=(Image *) NULL;
  982. p->next=(Image *) NULL;
  983. }
  984. return(p);
  985. }
  986. /*
  987. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  988. % %
  989. % %
  990. % %
  991. % R e m o v e F i r s t I m a g e F r o m L i s t %
  992. % %
  993. % %
  994. % %
  995. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  996. %
  997. % RemoveFirstImageFromList() removes and returns the first image in the list.
  998. %
  999. % If the given image list pointer pointed to the removed first image, it is
  1000. % set to the new first image of list, or NULL if list was emptied, otherwise
  1001. % it is left as is.
  1002. %
  1003. % The format of the RemoveFirstImageFromList method is:
  1004. %
  1005. % Image *RemoveFirstImageFromList(Image **images)
  1006. %
  1007. % A description of each parameter follows:
  1008. %
  1009. % o images: the image list.
  1010. %
  1011. */
  1012. MagickExport Image *RemoveFirstImageFromList(Image **images)
  1013. {
  1014. Image
  1015. *image;
  1016. assert(images != (Image **) NULL);
  1017. if ((*images) == (Image *) NULL)
  1018. return((Image *) NULL);
  1019. assert((*images)->signature == MagickCoreSignature);
  1020. if ((*images)->debug != MagickFalse)
  1021. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  1022. (*images)->filename);
  1023. image=(*images);
  1024. while (image->previous != (Image *) NULL)
  1025. image=image->previous;
  1026. if (image == *images)
  1027. *images=(*images)->next;
  1028. if (image->next != (Image *) NULL)
  1029. {
  1030. image->next->previous=(Image *) NULL;
  1031. image->next=(Image *) NULL;
  1032. }
  1033. return(image);
  1034. }
  1035. /*
  1036. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1037. % %
  1038. % %
  1039. % %
  1040. % R e m o v e L a s t I m a g e F r o m L i s t %
  1041. % %
  1042. % %
  1043. % %
  1044. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1045. %
  1046. % RemoveLastImageFromList() removes and returns the last image from the list.
  1047. %
  1048. % If the given image list pointer pointed to the removed last image, it is
  1049. % set to the new last image of list, or NULL if list was emptied, otherwise
  1050. % it is left as is.
  1051. %
  1052. % The format of the RemoveLastImageFromList method is:
  1053. %
  1054. % Image *RemoveLastImageFromList(Image **images)
  1055. %
  1056. % A description of each parameter follows:
  1057. %
  1058. % o images: the image list.
  1059. %
  1060. */
  1061. MagickExport Image *RemoveLastImageFromList(Image **images)
  1062. {
  1063. Image
  1064. *image;
  1065. assert(images != (Image **) NULL);
  1066. if ((*images) == (Image *) NULL)
  1067. return((Image *) NULL);
  1068. assert((*images)->signature == MagickCoreSignature);
  1069. if ((*images)->debug != MagickFalse)
  1070. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  1071. (*images)->filename);
  1072. image=(*images);
  1073. while (image->next != (Image *) NULL)
  1074. image=image->next;
  1075. if (image == *images)
  1076. *images=(*images)->previous;
  1077. if (image->previous != (Image *) NULL)
  1078. {
  1079. image->previous->next=(Image *) NULL;
  1080. image->previous=(Image *) NULL;
  1081. }
  1082. return(image);
  1083. }
  1084. /*
  1085. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1086. % %
  1087. % %
  1088. % %
  1089. % R e p l a c e I m a g e I n L i s t %
  1090. % %
  1091. % %
  1092. % %
  1093. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1094. %
  1095. % ReplaceImageInList() replaces an image in the list with the given image, or
  1096. % list of images. Old image is destroyed.
  1097. %
  1098. % The images list pointer is set to point to the first image of the inserted
  1099. % list of images.
  1100. %
  1101. % The format of the ReplaceImageInList method is:
  1102. %
  1103. % ReplaceImageInList(Image **images,Image *replace)
  1104. %
  1105. % A description of each parameter follows:
  1106. %
  1107. % o images: the list and pointer to image to replace
  1108. %
  1109. % o replace: the image or image list replacing the original
  1110. %
  1111. */
  1112. MagickExport void ReplaceImageInList(Image **images,Image *replace)
  1113. {
  1114. assert(images != (Image **) NULL);
  1115. assert(replace != (Image *) NULL);
  1116. assert(replace->signature == MagickCoreSignature);
  1117. if (replace->debug != MagickFalse)
  1118. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
  1119. if ((*images) == (Image *) NULL)
  1120. return;
  1121. assert((*images)->signature == MagickCoreSignature);
  1122. /* link next pointer */
  1123. replace=GetLastImageInList(replace);
  1124. replace->next=(*images)->next;
  1125. if (replace->next != (Image *) NULL)
  1126. replace->next->previous=replace;
  1127. /* link previous pointer - set images position to first replacement image */
  1128. replace=GetFirstImageInList(replace);
  1129. replace->previous=(*images)->previous;
  1130. if (replace->previous != (Image *) NULL)
  1131. replace->previous->next=replace;
  1132. /* destroy the replaced image that was in images */
  1133. (void) DestroyImage(*images);
  1134. (*images)=replace;
  1135. }
  1136. /*
  1137. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1138. % %
  1139. % %
  1140. % %
  1141. % 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 %
  1142. % %
  1143. % %
  1144. % %
  1145. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1146. %
  1147. % ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except
  1148. % the images pointer is set to the last image in the list of replacement
  1149. % images.
  1150. %
  1151. % This allows you to simply use GetNextImageInList() to go to the image
  1152. % that follows the just replaced image, even if a list of replacement images
  1153. % was inserted.
  1154. %
  1155. % The format of the ReplaceImageInList method is:
  1156. %
  1157. % ReplaceImageInListReturnLast(Image **images,Image *replace)
  1158. %
  1159. % A description of each parameter follows:
  1160. %
  1161. % o images: the list and pointer to image to replace
  1162. %
  1163. % o replace: the image or image list replacing the original
  1164. %
  1165. */
  1166. MagickExport void ReplaceImageInListReturnLast(Image **images,Image *replace)
  1167. {
  1168. assert(images != (Image **) NULL);
  1169. assert(replace != (Image *) NULL);
  1170. assert(replace->signature == MagickCoreSignature);
  1171. if (replace->debug != MagickFalse)
  1172. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",replace->filename);
  1173. if ((*images) == (Image *) NULL)
  1174. return;
  1175. assert((*images)->signature == MagickCoreSignature);
  1176. /* link previous pointer */
  1177. replace=GetFirstImageInList(replace);
  1178. replace->previous=(*images)->previous;
  1179. if (replace->previous != (Image *) NULL)
  1180. replace->previous->next=replace;
  1181. /* link next pointer - set images position to last replacement image */
  1182. replace=GetLastImageInList(replace);
  1183. replace->next=(*images)->next;
  1184. if (replace->next != (Image *) NULL)
  1185. replace->next->previous=replace;
  1186. /* destroy the replaced image that was in images */
  1187. (void) DestroyImage(*images);
  1188. (*images)=replace;
  1189. }
  1190. /*
  1191. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1192. % %
  1193. % %
  1194. % %
  1195. % R e v e r s e I m a g e L i s t %
  1196. % %
  1197. % %
  1198. % %
  1199. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1200. %
  1201. % ReverseImageList() reverses the order of an image list.
  1202. % The list pointer is reset to that start of the re-ordered list.
  1203. %
  1204. % The format of the ReverseImageList method is:
  1205. %
  1206. % void ReverseImageList(Image **images)
  1207. %
  1208. % A description of each parameter follows:
  1209. %
  1210. % o images: the image list.
  1211. %
  1212. */
  1213. MagickExport void ReverseImageList(Image **images)
  1214. {
  1215. Image
  1216. *next;
  1217. register Image
  1218. *p;
  1219. assert(images != (Image **) NULL);
  1220. if ((*images) == (Image *) NULL)
  1221. return;
  1222. assert((*images)->signature == MagickCoreSignature);
  1223. if ((*images)->debug != MagickFalse)
  1224. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  1225. (*images)->filename);
  1226. for (p=(*images); p->next != (Image *) NULL; p=p->next) ;
  1227. *images=p;
  1228. for ( ; p != (Image *) NULL; p=p->next)
  1229. {
  1230. next=p->next;
  1231. p->next=p->previous;
  1232. p->previous=next;
  1233. }
  1234. }
  1235. /*
  1236. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1237. % %
  1238. % %
  1239. % %
  1240. % S p l i c e I m a g e I n t o L i s t %
  1241. % %
  1242. % %
  1243. % %
  1244. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1245. %
  1246. % SpliceImageIntoList() removes 'length' images from the list and replaces
  1247. % them with the specified splice. Removed images are returned.
  1248. %
  1249. % The format of the SpliceImageIntoList method is:
  1250. %
  1251. % SpliceImageIntoList(Image **images,const size_t,
  1252. % const Image *splice)
  1253. %
  1254. % A description of each parameter follows:
  1255. %
  1256. % o images: the image list.
  1257. %
  1258. % o length: the length of the image list to remove.
  1259. %
  1260. % o splice: Replace the removed image list with this list.
  1261. %
  1262. */
  1263. MagickExport Image *SpliceImageIntoList(Image **images,
  1264. const size_t length,const Image *splice)
  1265. {
  1266. Image
  1267. *image,
  1268. *split;
  1269. register size_t
  1270. i;
  1271. assert(images != (Image **) NULL);
  1272. assert(splice != (Image *) NULL);
  1273. assert(splice->signature == MagickCoreSignature);
  1274. if ((*images) == (Image *) NULL)
  1275. return((Image *) NULL);
  1276. assert((*images)->signature == MagickCoreSignature);
  1277. if ((*images)->debug != MagickFalse)
  1278. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
  1279. (*images)->filename);
  1280. split=SplitImageList(*images);
  1281. AppendImageToList(images,splice);
  1282. image=(Image *) NULL;
  1283. for (i=0; (i < length) && (split != (Image *) NULL); i++)
  1284. AppendImageToList(&image,RemoveImageFromList(&split));
  1285. AppendImageToList(images,split);
  1286. return(image);
  1287. }
  1288. /*
  1289. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1290. % %
  1291. % %
  1292. % %
  1293. % S p l i t I m a g e L i s t %
  1294. % %
  1295. % %
  1296. % %
  1297. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1298. %
  1299. % SplitImageL…

Large files files are truncated, but you can click here to view the full file