/GraphicsMagick-1.3.16/magick/list.c

# · C · 946 lines · 365 code · 20 blank · 561 comment · 158 complexity · 722b90ae067693fd45b64ab800ed3f38 MD5 · raw file

  1. /*
  2. % Copyright (C) 2003 GraphicsMagick Group
  3. % Copyright (C) 2002, 2003 ImageMagick Studio
  4. %
  5. % This program is covered by multiple licenses, which are described in
  6. % Copyright.txt. You should have received a copy of Copyright.txt with this
  7. % package; otherwise see http://www.graphicsmagick.org/www/Copyright.html.
  8. %
  9. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  10. % %
  11. % %
  12. % %
  13. % L IIIII SSSSS TTTTT %
  14. % L I SS T %
  15. % L I SSS T %
  16. % L I SS T %
  17. % LLLLL IIIII SSSSS T %
  18. % %
  19. % %
  20. % GraphicsMagick Image List Methods %
  21. % %
  22. % %
  23. % Software Design %
  24. % John Cristy %
  25. % January 2003 %
  26. % %
  27. % %
  28. % %
  29. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  30. %
  31. %
  32. %
  33. */
  34. /*
  35. Include declarations.
  36. */
  37. #include "magick/studio.h"
  38. #include "magick/list.h"
  39. #include "magick/blob.h"
  40. #include "magick/utility.h"
  41. /*
  42. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  43. % %
  44. % %
  45. % %
  46. % A p p e n d I m a g e T o L i s t %
  47. % %
  48. % %
  49. % %
  50. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  51. %
  52. % AppendImageToList() appends an image to the end of the list.
  53. %
  54. % The format of the AppendImageToList method is:
  55. %
  56. % AppendImageToList(Image **images,Image *image)
  57. %
  58. % A description of each parameter follows:
  59. %
  60. % o images: The image list.
  61. %
  62. % o image: The image.
  63. %
  64. %
  65. */
  66. MagickExport void AppendImageToList(Image **images,Image *image)
  67. {
  68. register Image
  69. *p;
  70. assert(images != (Image **) NULL);
  71. if (image == (Image *) NULL)
  72. return;
  73. assert(image->signature == MagickSignature);
  74. if ((*images) == (Image *) NULL)
  75. {
  76. *images=image;
  77. return;
  78. }
  79. assert((*images)->signature == MagickSignature);
  80. for (p=(*images); p->next != (Image *) NULL; p=p->next);
  81. p->next=image;
  82. image->previous=p;
  83. }
  84. /*
  85. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  86. % %
  87. % %
  88. % %
  89. % C l o n e I m a g e L i s t %
  90. % %
  91. % %
  92. % %
  93. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  94. %
  95. % CloneImageList() returns a duplicate of the image list.
  96. %
  97. % The format of the CloneImageList method is:
  98. %
  99. % Image *CloneImageList(const Image *images,ExceptionInfo *exception)
  100. %
  101. % A description of each parameter follows:
  102. %
  103. % o images: The image list.
  104. %
  105. % o exception: Return any errors or warnings in this structure.
  106. %
  107. %
  108. */
  109. MagickExport Image *CloneImageList(const Image *images,ExceptionInfo *exception)
  110. {
  111. Image
  112. *clone,
  113. *image;
  114. register Image
  115. *p;
  116. if (images == (Image *) NULL)
  117. return((Image *) NULL);
  118. assert(images->signature == MagickSignature);
  119. while (images->previous != (Image *) NULL)
  120. images=images->previous;
  121. image=(Image *) NULL;
  122. for (p=(Image *) NULL; images != (Image *) NULL; images=images->next)
  123. {
  124. clone=CloneImage(images,0,0,True,exception);
  125. if (clone == (Image *) NULL)
  126. {
  127. if (image != (Image *) NULL)
  128. DestroyImageList(image);
  129. return((Image *) NULL);
  130. }
  131. if (image == (Image *) NULL)
  132. {
  133. image=clone;
  134. p=image;
  135. continue;
  136. }
  137. p->next=clone;
  138. clone->previous=p;
  139. p=p->next;
  140. }
  141. return(image);
  142. }
  143. /*
  144. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  145. % %
  146. % %
  147. % %
  148. % D e l e t e I m a g e F r o m L i s t %
  149. % %
  150. % %
  151. % %
  152. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  153. %
  154. % DeleteImageFromList() deletes an image from the list.
  155. %
  156. % The format of the DeleteImageFromList method is:
  157. %
  158. % DeleteImageFromList(Image **images)
  159. %
  160. % A description of each parameter follows:
  161. %
  162. % o images: The image list.
  163. %
  164. %
  165. */
  166. MagickExport void DeleteImageFromList(Image **images)
  167. {
  168. register Image
  169. *p;
  170. assert(images != (Image **) NULL);
  171. if ((*images) == (Image *) NULL)
  172. return;
  173. assert((*images)->signature == MagickSignature);
  174. p=(*images);
  175. if ((p->previous == (Image *) NULL) && (p->next == (Image *) NULL))
  176. *images=(Image *) NULL;
  177. else
  178. {
  179. if (p->previous != (Image *) NULL)
  180. {
  181. p->previous->next=p->next;
  182. *images=p->previous;
  183. }
  184. if (p->next != (Image *) NULL)
  185. {
  186. p->next->previous=p->previous;
  187. *images=p->next;
  188. }
  189. }
  190. DestroyImage(p);
  191. }
  192. /*
  193. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  194. % %
  195. % %
  196. % %
  197. % D e s t r o y I m a g e L i s t %
  198. % %
  199. % %
  200. % %
  201. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  202. %
  203. % DestroyImageList() destroys an image list.
  204. %
  205. % The format of the DestroyImageList method is:
  206. %
  207. % void DestroyImageList(Image *image)
  208. %
  209. % A description of each parameter follows:
  210. %
  211. % o image: The image sequence.
  212. %
  213. %
  214. */
  215. MagickExport void DestroyImageList(Image *images)
  216. {
  217. register Image
  218. *p;
  219. if (images == (Image *) NULL)
  220. return;
  221. assert(images->signature == MagickSignature);
  222. for (p=images; p->previous != (Image *) NULL; p=p->previous);
  223. for (images=p; p != (Image *) NULL; images=p)
  224. {
  225. p=p->next;
  226. images->next=0;
  227. if(p)
  228. p->previous=0;
  229. DestroyImage(images);
  230. }
  231. }
  232. /*
  233. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  234. % %
  235. % %
  236. % %
  237. % G e t F i r s t I m a g e I n L i s t %
  238. % %
  239. % %
  240. % %
  241. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  242. %
  243. % GetFirstImageInList() returns a pointer to the first image in the list
  244. %
  245. % The format of the GetFirstImageInList method is:
  246. %
  247. % Image *GetFirstImageInList(const Image *images)
  248. %
  249. % A description of each parameter follows:
  250. %
  251. % o images: The image list.
  252. %
  253. */
  254. MagickExport Image *GetFirstImageInList(const Image *images)
  255. {
  256. register const Image
  257. *p;
  258. if (images == (Image *) NULL)
  259. return((Image *) NULL);
  260. assert(images->signature == MagickSignature);
  261. for (p=images; p->previous != (Image *) NULL; p=p->previous);
  262. return((Image *) p);
  263. }
  264. /*
  265. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  266. % %
  267. % %
  268. % %
  269. % G e t I m a g e F r o m L i s t %
  270. % %
  271. % %
  272. % %
  273. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  274. %
  275. % GetImageFromList() returns an image at the specified offset from the list.
  276. %
  277. % The format of the GetImageFromList method is:
  278. %
  279. % Image *GetImageFromList(const Image *images,const long offset)
  280. %
  281. % A description of each parameter follows:
  282. %
  283. % o images: The image list.
  284. %
  285. % o offset: The position within the list.
  286. %
  287. %
  288. */
  289. MagickExport Image *GetImageFromList(const Image *images,const long offset)
  290. {
  291. register const Image
  292. *p;
  293. register long
  294. i;
  295. if (images == (Image *) NULL)
  296. return((Image *) NULL);
  297. assert(images->signature == MagickSignature);
  298. for (p=images; p->previous != (Image *) NULL; p=p->previous);
  299. for (i=0; p != (Image *) NULL; p=p->next)
  300. if (i++ == offset)
  301. break;
  302. if (p == (Image *) NULL)
  303. return((Image *) NULL);
  304. return((Image *) p);
  305. }
  306. /*
  307. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  308. % %
  309. % %
  310. % %
  311. % G e t I m a g e I n d e x I n L i s t %
  312. % %
  313. % %
  314. % %
  315. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  316. %
  317. % GetImageIndexInList() returns the offset in the list of the specified image.
  318. %
  319. % The format of the GetImageIndexInList method is:
  320. %
  321. % long GetImageIndexInList(const Image *images)
  322. %
  323. % A description of each parameter follows:
  324. %
  325. % o images: The image list.
  326. %
  327. %
  328. */
  329. MagickExport long GetImageIndexInList(const Image *images)
  330. {
  331. register long
  332. i;
  333. if (images == (const Image *) NULL)
  334. return(-1);
  335. assert(images->signature == MagickSignature);
  336. for (i=0; images->previous != (Image *) NULL; i++)
  337. images=images->previous;
  338. return(i);
  339. }
  340. /*
  341. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  342. % %
  343. % %
  344. % %
  345. % G e t I m a g e L i s t L e n g t h %
  346. % %
  347. % %
  348. % %
  349. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  350. %
  351. % GetImageListLength() returns the length of the list (the number of images in
  352. % the list).
  353. %
  354. % The format of the GetImageListLength method is:
  355. %
  356. % unsigned long GetImageListLength(const Image *images)
  357. %
  358. % A description of each parameter follows:
  359. %
  360. % o images: The image list.
  361. %
  362. %
  363. */
  364. MagickExport unsigned long GetImageListLength(const Image *images)
  365. {
  366. register long
  367. i;
  368. if (images == (Image *) NULL)
  369. return(0);
  370. assert(images->signature == MagickSignature);
  371. while (images->previous != (Image *) NULL)
  372. images=images->previous;
  373. for (i=0; images != (Image *) NULL; images=images->next)
  374. i++;
  375. return(i);
  376. }
  377. /*
  378. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  379. % %
  380. % %
  381. % %
  382. % G e t L a s t I m a g e I n L i s t %
  383. % %
  384. % %
  385. % %
  386. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  387. %
  388. % GetLastImageInList() returns a pointer to the last image in the list
  389. %
  390. % The format of the GetLastImageInList method is:
  391. %
  392. % Image *GetLastImageInList(const Image *images)
  393. %
  394. % A description of each parameter follows:
  395. %
  396. % o images: The image list.
  397. %
  398. */
  399. MagickExport Image *GetLastImageInList(const Image *images)
  400. {
  401. register const Image
  402. *p;
  403. if (images == (Image *) NULL)
  404. return((Image *) NULL);
  405. assert(images->signature == MagickSignature);
  406. for (p=images; p->next != (Image *) NULL; p=p->next);
  407. return((Image *) p);
  408. }
  409. /*
  410. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  411. % %
  412. % %
  413. % %
  414. % G e t N e x t I m a g e I n L i s t %
  415. % %
  416. % %
  417. % %
  418. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  419. %
  420. % GetNextImageInList() returns the next image in the list.
  421. %
  422. % The format of the GetNextImageInList method is:
  423. %
  424. % Image *GetNextImageInList(const Image *images)
  425. %
  426. % A description of each parameter follows:
  427. %
  428. % o images: The image list.
  429. %
  430. %
  431. */
  432. MagickExport Image *GetNextImageInList(const Image *images)
  433. {
  434. if (images == (Image *) NULL)
  435. return((Image *) NULL);
  436. assert(images->signature == MagickSignature);
  437. return(images->next);
  438. }
  439. /*
  440. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  441. % %
  442. % %
  443. % %
  444. % G e t P r e v i o u s I m a g e I n L i s t %
  445. % %
  446. % %
  447. % %
  448. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  449. %
  450. % GetPreviousImageInList() returns the previous image in the list.
  451. %
  452. % The format of the GetPreviousImageInList method is:
  453. %
  454. % Image *GetPreviousImageInList(const Image *images)
  455. %
  456. % A description of each parameter follows:
  457. %
  458. % o images: The image list.
  459. %
  460. %
  461. */
  462. MagickExport Image *GetPreviousImageInList(const Image *images)
  463. {
  464. if (images == (Image *) NULL)
  465. return((Image *) NULL);
  466. assert(images->signature == MagickSignature);
  467. return(images->previous);
  468. }
  469. /*
  470. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  471. % %
  472. % %
  473. % I m a g e L i s t T o A r r a y %
  474. % %
  475. % %
  476. % %
  477. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  478. %
  479. % ImageListToArray() is a convenience method that converts an image list to
  480. % a sequential array. For example,
  481. %
  482. % group = ImageListToArray(images, exception);
  483. % for (i = 0; i < n; i++)
  484. % puts(group[i]->filename);
  485. %
  486. % The format of the ImageListToArray method is:
  487. %
  488. % Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
  489. %
  490. % A description of each parameter follows:
  491. %
  492. % o image: The image list.
  493. %
  494. % o exception: Return any errors or warnings in this structure.
  495. %
  496. %
  497. */
  498. MagickExport Image **ImageListToArray(const Image *images,
  499. ExceptionInfo *exception)
  500. {
  501. Image
  502. **group;
  503. register long
  504. i;
  505. if (images == (Image *) NULL)
  506. return((Image **) NULL);
  507. assert(images->signature == MagickSignature);
  508. group=MagickAllocateMemory(Image **,(GetImageListLength(images)+1)*sizeof(Image *));
  509. if (group == (Image **) NULL)
  510. {
  511. ThrowException3(exception,ResourceLimitError,MemoryAllocationFailed,
  512. UnableToCreateImageGroup);
  513. return((Image **) NULL);
  514. }
  515. while (images->previous != (Image *) NULL)
  516. images=images->previous;
  517. for (i=0; images != (Image *) NULL; images=images->next)
  518. group[i++]=(Image *) images;
  519. group[i] = (Image *) NULL;
  520. return(group);
  521. }
  522. /*
  523. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  524. % %
  525. % %
  526. % %
  527. % I n s e r t I m a g e I n L i s t %
  528. % %
  529. % %
  530. % %
  531. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  532. %
  533. % InsertImageInList() inserts an image in the list.
  534. %
  535. % The format of the InsertImageInList method is:
  536. %
  537. % InsertImageInList(Image **images,Image *image)
  538. %
  539. % A description of each parameter follows:
  540. %
  541. % o images: The image list.
  542. %
  543. % o image: The image.
  544. %
  545. %
  546. */
  547. MagickExport void InsertImageInList(Image **images,Image *image)
  548. {
  549. Image
  550. *split;
  551. assert(images != (Image **) NULL);
  552. assert(image != (Image *) NULL);
  553. assert(image->signature == MagickSignature);
  554. if ((*images) == (Image *) NULL)
  555. return;
  556. assert((*images)->signature == MagickSignature);
  557. split=SplitImageList(*images);
  558. if (split == (Image *) NULL)
  559. return;
  560. AppendImageToList(images,image);
  561. AppendImageToList(images,split);
  562. }
  563. /*
  564. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  565. % %
  566. % %
  567. % %
  568. % N e w I m a g e L i s t %
  569. % %
  570. % %
  571. % %
  572. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  573. %
  574. % NewImageList() creates an empty image list.
  575. %
  576. % The format of the NewImageList method is:
  577. %
  578. % Image *NewImageList(void)
  579. %
  580. */
  581. MagickExport Image *NewImageList(void)
  582. {
  583. return((Image *) NULL);
  584. }
  585. /*
  586. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  587. % %
  588. % %
  589. % %
  590. % P r e p e n d I m a g e T o L i s t %
  591. % %
  592. % %
  593. % %
  594. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  595. %
  596. % PrependImageToList() prepends the image to the beginning of the list.
  597. %
  598. % The format of the PrependImageToList method is:
  599. %
  600. % PrependImageToList(Image *images,Image *image)
  601. %
  602. % A description of each parameter follows:
  603. %
  604. % o images: The image list.
  605. %
  606. % o image: The image.
  607. %
  608. %
  609. */
  610. MagickExport void PrependImageToList(Image **images,Image *image)
  611. {
  612. AppendImageToList(&image,*images);
  613. }
  614. /*
  615. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  616. % %
  617. % %
  618. % %
  619. % R e m o v e F i r s t I m a g e F r o m L i s t %
  620. % %
  621. % %
  622. % %
  623. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  624. %
  625. % RemoveFirstImageFromList() removes an image from the beginning of the list.
  626. %
  627. % The format of the RemoveFirstImageFromList method is:
  628. %
  629. % Image *RemoveFirstImageFromList(Image **images)
  630. %
  631. % A description of each parameter follows:
  632. %
  633. % o images: The image list.
  634. %
  635. %
  636. */
  637. MagickExport Image *RemoveFirstImageFromList(Image **images)
  638. {
  639. Image
  640. *image;
  641. assert(images != (Image **) NULL);
  642. if ((*images) == (Image *) NULL)
  643. return((Image *) NULL);
  644. assert((*images)->signature == MagickSignature);
  645. image=(*images);
  646. while (image->previous != (Image *) NULL)
  647. image=image->previous;
  648. if (image == *images)
  649. *images=(*images)->next;
  650. if (image->next != (Image *) NULL)
  651. {
  652. image->next->previous=(Image *) NULL;
  653. image->next=(Image *) NULL;
  654. }
  655. return(image);
  656. }
  657. /*
  658. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  659. % %
  660. % %
  661. % %
  662. % R e m o v e L a s t I m a g e F r o m L i s t %
  663. % %
  664. % %
  665. % %
  666. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  667. %
  668. % RemoveLastImageFromList() removes the last image from the list.
  669. %
  670. % The format of the RemoveLastImageFromList method is:
  671. %
  672. % Image *RemoveLastImageFromList(Image **images)
  673. %
  674. % A description of each parameter follows:
  675. %
  676. % o images: The image list.
  677. %
  678. %
  679. */
  680. MagickExport Image *RemoveLastImageFromList(Image **images)
  681. {
  682. Image
  683. *image;
  684. assert(images != (Image **) NULL);
  685. if ((*images) == (Image *) NULL)
  686. return((Image *) NULL);
  687. assert((*images)->signature == MagickSignature);
  688. image=(*images);
  689. while (image->next != (Image *) NULL)
  690. image=image->next;
  691. if (image == *images)
  692. *images=(*images)->previous;
  693. if (image->previous != (Image *) NULL)
  694. {
  695. image->previous->next=(Image *) NULL;
  696. image->previous=(Image *) NULL;
  697. }
  698. return(image);
  699. }
  700. /*
  701. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  702. % %
  703. % %
  704. % %
  705. % R e p l a c e I m a g e I n L i s t %
  706. % %
  707. % %
  708. % %
  709. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  710. %
  711. % ReplaceImageInList() replaces an image in the list.
  712. %
  713. % The format of the ReplaceImageInList method is:
  714. %
  715. % ReplaceImageInList(Image **images,Image *image)
  716. %
  717. % A description of each parameter follows:
  718. %
  719. % o images: The image list.
  720. %
  721. % o image: The image.
  722. %
  723. %
  724. */
  725. MagickExport void ReplaceImageInList(Image **images,Image *image)
  726. {
  727. assert(images != (Image **) NULL);
  728. assert(image != (Image *) NULL);
  729. assert(image->signature == MagickSignature);
  730. if ((*images) == (Image *) NULL)
  731. return;
  732. assert((*images)->signature == MagickSignature);
  733. image->next=(*images)->next;
  734. if (image->next != (Image *) NULL)
  735. image->next->previous=image;
  736. image->previous=(*images)->previous;
  737. if (image->previous != (Image *) NULL)
  738. image->previous->next=image;
  739. DestroyImage(*images);
  740. (*images)=image;
  741. }
  742. /*
  743. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  744. % %
  745. % %
  746. % %
  747. % R e v e r s e I m a g e L i s t %
  748. % %
  749. % %
  750. % %
  751. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  752. %
  753. % ReverseImageList() reverses the image list.
  754. %
  755. % The format of the ReverseImageList method is:
  756. %
  757. % ReverseImageList(const Image **images)
  758. %
  759. % A description of each parameter follows:
  760. %
  761. % o images: The image list.
  762. %
  763. %
  764. */
  765. MagickExport void ReverseImageList(Image **images)
  766. {
  767. Image
  768. *next;
  769. register Image
  770. *p;
  771. assert(images != (Image **) NULL);
  772. if ((*images) == (Image *) NULL)
  773. return;
  774. assert((*images)->signature == MagickSignature);
  775. for (p=(*images); p->next != (Image *) NULL; p=p->next);
  776. *images=p;
  777. for ( ; p != (Image *) NULL; p=p->next)
  778. {
  779. next=p->next;
  780. p->next=p->previous;
  781. p->previous=next;
  782. }
  783. }
  784. /*
  785. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  786. % %
  787. % %
  788. % %
  789. % S p l i c e I m a g e I n t o L i s t %
  790. % %
  791. % %
  792. % %
  793. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  794. %
  795. % SpliceImageIntoList() removes 'length' images from the list and replaces
  796. % them with the specified splice.
  797. %
  798. % The format of the SpliceImageIntoList method is:
  799. %
  800. % SpliceImageIntoList(Image **images,const unsigned long length,
  801. % Image *splice)
  802. %
  803. % A description of each parameter follows:
  804. %
  805. % o images: The image list.
  806. %
  807. % o length: The length of the image list to remove.
  808. %
  809. % o splice: Replace the removed image list with this list.
  810. %
  811. %
  812. */
  813. MagickExport void SpliceImageIntoList(Image **images,const unsigned long length,
  814. Image *splice)
  815. {
  816. Image
  817. *split;
  818. register long
  819. i;
  820. assert(images != (Image **) NULL);
  821. assert(splice != (Image *) NULL);
  822. assert(splice->signature == MagickSignature);
  823. if ((*images) == (Image *) NULL)
  824. return;
  825. assert((*images)->signature == MagickSignature);
  826. split=SplitImageList(*images);
  827. if (split == (Image *) NULL)
  828. return;
  829. AppendImageToList(images,splice);
  830. for (i=0; (i < (long) length) && (split != (Image *) NULL); i++)
  831. (void) DeleteImageFromList(&split);
  832. AppendImageToList(images,split);
  833. }
  834. /*
  835. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  836. % %
  837. % %
  838. % %
  839. % S p l i t I m a g e L i s t %
  840. % %
  841. % %
  842. % %
  843. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  844. %
  845. % SplitImageList() splits an image into two lists.
  846. %
  847. % The format of the SplitImageList method is:
  848. %
  849. % Image *SplitImageList(Image *images)
  850. %
  851. % A description of each parameter follows:
  852. %
  853. % o images: The image list.
  854. %
  855. %
  856. */
  857. MagickExport Image *SplitImageList(Image *images)
  858. {
  859. if ((images == (Image *) NULL) || (images->next == (Image *) NULL))
  860. return((Image *) NULL);
  861. images=images->next;
  862. images->previous->next=(Image *) NULL;
  863. images->previous=(Image *) NULL;
  864. return(images);
  865. }
  866. /*
  867. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  868. % %
  869. % %
  870. % %
  871. + S y n c N e x t I m a g e I n L i s t %
  872. % %
  873. % %
  874. % %
  875. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  876. %
  877. % SyncNextImageInList() returns the next image in the list after the blob
  878. % referenced is synchronized with the current image.
  879. %
  880. % The format of the SyncNextImageInList method is:
  881. %
  882. % Image *SyncNextImageInList(const Image *images)
  883. %
  884. % A description of each parameter follows:
  885. %
  886. % o images: The image list.
  887. %
  888. %
  889. */
  890. MagickExport Image *SyncNextImageInList(const Image *images)
  891. {
  892. if (images == (Image *) NULL)
  893. return((Image *) NULL);
  894. assert(images->signature == MagickSignature);
  895. if (images->next == (Image *) NULL)
  896. return((Image *) NULL);
  897. if (images->blob != images->next->blob)
  898. {
  899. DestroyBlob(images->next);
  900. images->next->blob=ReferenceBlob(images->blob);
  901. }
  902. return(images->next);
  903. }