PageRenderTime 65ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/ImageMagick-6.3.2/magick/list.c

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