Home | History | Annotate | Download | only in tests
      1 #include <stdio.h>
      2 #include <MagickWand/MagickWand.h>
      3 
      4 /* set this to true to test loops methods with a empty wand */
      5 #define TEST_EMPTY_WAND 0
      6 
      7 /* Simplify the exception handling
      8  * technically we should abort the program if
      9  *      severity >= ErrorException
     10  */
     11 void ThrowWandException(MagickWand *wand)
     12 { char
     13   *description;
     14 
     15   ExceptionType
     16   severity;
     17 
     18   description=MagickGetException(wand,&severity);
     19   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description);
     20   description=(char *) MagickRelinquishMemory(description);
     21 }
     22 
     23 /* useful function especially after appending two wands together */
     24 #define SwapWands(a,b) { MagickWand *tmp=a; a=b; b=tmp; }
     25 
     26 int main(int argc, char *argv[])
     27 {
     28   MagickWand
     29     *wand,
     30     *output;
     31 
     32   MagickBooleanType
     33     status;
     34 
     35   MagickWandGenesis();
     36 
     37   printf("Read in a list of 6 images...\n");
     38 
     39   wand = NewMagickWand();
     40 #if !TEST_EMPTY_WAND
     41   status = MagickReadImage(wand, "font_0.gif" )
     42         && MagickReadImage(wand, "font_1.gif" )
     43         && MagickReadImage(wand, "font_2.gif" )
     44         && MagickReadImage(wand, "font_3.gif" )
     45         && MagickReadImage(wand, "font_4.gif" )
     46         && MagickReadImage(wand, "font_5.gif" );
     47   if (status == MagickFalse)
     48     ThrowWandException(wand);
     49 #endif
     50 
     51   printf("I actually read in %u images\n",
     52              (unsigned) MagickGetNumberImages(wand) );
     53   printf("\n");
     54 
     55   printf("After reading current image is #%d \"%s\"\n",
     56               (unsigned) MagickGetIteratorIndex(wand),
     57               MagickGetImageFilename(wand) );
     58   printf("\n");
     59 
     60   // Note that using MagickGetIteratorIndex() is slower than just
     61   // keeping track of the current image index yourself! But not a great cost.
     62 
     63   printf("Standard 'Reset while Next' loop through images\n");
     64   // keeping track of it to start with!
     65   MagickResetIterator(wand);
     66   while (MagickNextImage(wand) != MagickFalse)
     67     printf("image #%u \"%s\"\n",
     68               (unsigned) MagickGetIteratorIndex(wand),
     69               MagickGetImageFilename(wand) );
     70   printf("\n");
     71 
     72   printf("At this point, any image 'added' to wand will be appended!\n");
     73   printf("This special condition can be set by using either\n");
     74   printf("just         MagickSetLastIterator(w)\n");
     75   printf("or           MagickSetIteratorIndex(w,-1)\n");
     76   printf("\n");
     77 
     78   printf("Now that we are at the end, lets loop backward using 'Previous'\n");
     79   while (MagickPreviousImage(wand) != MagickFalse)
     80     printf("image #%u \"%s\"\n",
     81               (unsigned) MagickGetIteratorIndex(wand),
     82               MagickGetImageFilename(wand) );
     83   printf("\n");
     84 
     85 
     86   printf("Note at this point, any image 'added' to wand will be prepended!\n");
     87   printf("This special condition can be set by using either\n");
     88   printf("just         MagickSetFirstIterator(w)\n");
     89   printf("Or      MagickResetIterator(w); MagickPreviousImage(w);\n");
     90   printf("The latter method being the cause of the current condition\n");
     91   printf("\n");
     92 
     93 
     94   printf("Directly loop though images backward using 'Last, while Previous'\n");
     95   MagickSetLastIterator(wand);
     96   while ( MagickPreviousImage(wand) != MagickFalse )
     97     printf("image #%u \"%s\"\n",
     98               (unsigned) MagickGetIteratorIndex(wand),
     99               MagickGetImageFilename(wand) );
    100   printf("\n");
    101 
    102 
    103   printf("Loop through images using Indexes, in a weird flip-flop way!\n");
    104   printf("Note that indexing using a negative number, indexes from end \n");
    105   { ssize_t  i;
    106     ssize_t  n = (ssize_t) MagickGetNumberImages(wand);
    107 
    108     for ( i=0; i!=n;  i= (i>=0) ? -(i+1):-i ) {
    109       (void) MagickSetIteratorIndex(wand,i);
    110          /* Note that a return of MagickFalse by the above is not actually an
    111           * error (no exception will be generated).  It just means that the
    112           * index value used (positive or negative) is too large for the
    113           * size of the current image list  (EG: range error: -n <= i < n )
    114           * When it does happen, no change is made to the current image
    115           */
    116       printf("index %2d -> #%u \"%s\"\n", (int) i,
    117                 (unsigned) MagickGetIteratorIndex(wand),
    118                 MagickGetImageFilename(wand) );
    119     }
    120   }
    121   printf("\n");
    122 
    123 
    124   wand=DestroyMagickWand(wand);
    125 
    126   MagickWandTerminus();
    127 }
    128 
    129