root/ext/gd/libgd/gdtest.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. unlink
  2. main
  3. CompareImages
  4. freadWrapper
  5. fwriteWrapper

   1 #include <stdio.h>
   2 #ifdef _WIN32
   3 #include <process.h>
   4 int
   5 unlink (const char *filename)
   6 {
   7   return _unlink (filename);
   8 }
   9 #else
  10 #include <unistd.h>             /* for getpid(), unlink() */
  11 #endif
  12 #include "gd.h"
  13 
  14 void CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2);
  15 
  16 static int freadWrapper (void *context, char *buf, int len);
  17 static int fwriteWrapper (void *context, const char *buffer, int len);
  18 
  19 int
  20 main (int argc, char **argv)
  21 {
  22   gdImagePtr im, ref, im2, im3;
  23   FILE *in, *out;
  24   void *iptr;
  25   int sz;
  26   gdIOCtxPtr ctx;
  27   char of[256];
  28   int colRed, colBlu;
  29   gdSource imgsrc;
  30   gdSink imgsnk;
  31   int foreground;
  32   int i;
  33   if (argc != 2)
  34     {
  35       fprintf (stderr, "Usage: gdtest filename.png\n");
  36       exit (1);
  37     }
  38   in = fopen (argv[1], "rb");
  39   if (!in)
  40     {
  41       fprintf (stderr, "Input file does not exist!\n");
  42       exit (1);
  43     }
  44   im = gdImageCreateFromPng (in);
  45 
  46   rewind (in);
  47   ref = gdImageCreateFromPng (in);
  48 
  49   fclose (in);
  50 
  51   printf ("Reference File has %d Palette entries\n", ref->colorsTotal);
  52 
  53   CompareImages ("Initial Versions", ref, im);
  54 
  55 
  56   /* */
  57   /* Send to PNG File then Ptr */
  58   /* */
  59   snprintf (of, sizeof(of), "%s.png", argv[1]);
  60   out = fopen (of, "wb");
  61   gdImagePng (im, out);
  62   fclose (out);
  63 
  64   in = fopen (of, "rb");
  65   if (!in)
  66     {
  67       fprintf (stderr, "PNG Output file does not exist!\n");
  68       exit (1);
  69     }
  70   im2 = gdImageCreateFromPng (in);
  71   fclose (in);
  72 
  73   CompareImages ("GD->PNG File->GD", ref, im2);
  74 
  75   unlink (of);
  76   gdImageDestroy (im2);
  77 
  78   iptr = gdImagePngPtr (im, &sz);
  79   ctx = gdNewDynamicCtx (sz, iptr);
  80   im2 = gdImageCreateFromPngCtx (ctx);
  81 
  82   CompareImages ("GD->PNG ptr->GD", ref, im2);
  83 
  84   gdImageDestroy (im2);
  85   ctx->gd_free (ctx);
  86 
  87 
  88   /* */
  89   /* Send to GD2 File then Ptr */
  90   /* */
  91   snprintf (of, sizeof(of), "%s.gd2", argv[1]);
  92   out = fopen (of, "wb");
  93   gdImageGd2 (im, out, 128, 2);
  94   fclose (out);
  95 
  96   in = fopen (of, "rb");
  97   if (!in)
  98     {
  99       fprintf (stderr, "GD2 Output file does not exist!\n");
 100       exit (1);
 101     }
 102   im2 = gdImageCreateFromGd2 (in);
 103   fclose (in);
 104 
 105   CompareImages ("GD->GD2 File->GD", ref, im2);
 106 
 107   unlink (of);
 108   gdImageDestroy (im2);
 109 
 110   iptr = gdImageGd2Ptr (im, 128, 2, &sz);
 111   /*printf("Got ptr %d (size %d)\n",iptr, sz); */
 112   ctx = gdNewDynamicCtx (sz, iptr);
 113   /*printf("Got ctx %d\n",ctx); */
 114   im2 = gdImageCreateFromGd2Ctx (ctx);
 115   /*printf("Got img2 %d\n",im2); */
 116 
 117   CompareImages ("GD->GD2 ptr->GD", ref, im2);
 118 
 119   gdImageDestroy (im2);
 120   ctx->gd_free (ctx);
 121 
 122 
 123   /* */
 124   /* Send to GD File then Ptr */
 125   /* */
 126   snprintf (of, sizeof(of), "%s.gd", argv[1]);
 127   out = fopen (of, "wb");
 128   gdImageGd (im, out);
 129   fclose (out);
 130 
 131   in = fopen (of, "rb");
 132   if (!in)
 133     {
 134       fprintf (stderr, "GD Output file does not exist!\n");
 135       exit (1);
 136     }
 137   im2 = gdImageCreateFromGd (in);
 138   fclose (in);
 139 
 140   CompareImages ("GD->GD File->GD", ref, im2);
 141 
 142   unlink (of);
 143   gdImageDestroy (im2);
 144 
 145   iptr = gdImageGdPtr (im, &sz);
 146   /*printf("Got ptr %d (size %d)\n",iptr, sz); */
 147   ctx = gdNewDynamicCtx (sz, iptr);
 148   /*printf("Got ctx %d\n",ctx); */
 149   im2 = gdImageCreateFromGdCtx (ctx);
 150   /*printf("Got img2 %d\n",im2); */
 151 
 152   CompareImages ("GD->GD ptr->GD", ref, im2);
 153 
 154   gdImageDestroy (im2);
 155   ctx->gd_free (ctx);
 156 
 157   /*
 158      ** Test gdImageCreateFromPngSource'
 159      * */
 160 
 161   in = fopen (argv[1], "rb");
 162 
 163   imgsrc.source = freadWrapper;
 164   imgsrc.context = in;
 165   im2 = gdImageCreateFromPngSource (&imgsrc);
 166   fclose (in);
 167 
 168   if (im2 == NULL)
 169     {
 170       printf ("GD Source: ERROR Null returned by gdImageCreateFromPngSource\n");
 171     }
 172   else
 173     {
 174       CompareImages ("GD Source", ref, im2);
 175       gdImageDestroy (im2);
 176     };
 177 
 178 
 179   /*
 180      ** Test gdImagePngToSink'
 181      * */
 182 
 183   snprintf (of, sizeof(of), "%s.snk", argv[1]);
 184   out = fopen (of, "wb");
 185   imgsnk.sink = fwriteWrapper;
 186   imgsnk.context = out;
 187   gdImagePngToSink (im, &imgsnk);
 188   fclose (out);
 189   in = fopen (of, "rb");
 190   if (!in)
 191     {
 192       fprintf (stderr, "GD Sink: ERROR - GD Sink Output file does not exist!\n");
 193     }
 194   else
 195     {
 196       im2 = gdImageCreateFromPng (in);
 197       fclose (in);
 198 
 199       CompareImages ("GD Sink", ref, im2);
 200       gdImageDestroy (im2);
 201     };
 202 
 203   unlink (of);
 204 
 205   /* */
 206   /*  Test Extraction */
 207   /* */
 208   in = fopen ("test/gdtest_200_300_150_100.png", "rb");
 209   if (!in)
 210     {
 211       fprintf (stderr, "gdtest_200_300_150_100.png does not exist!\n");
 212       exit (1);
 213     }
 214   im2 = gdImageCreateFromPng (in);
 215   fclose (in);
 216 
 217 
 218   in = fopen ("test/gdtest.gd2", "rb");
 219   if (!in)
 220     {
 221       fprintf (stderr, "gdtest.gd2 does not exist!\n");
 222       exit (1);
 223     }
 224   im3 = gdImageCreateFromGd2Part (in, 200, 300, 150, 100);
 225   fclose (in);
 226 
 227   CompareImages ("GD2Part (gdtest_200_300_150_100.png, gdtest.gd2(part))", im2, im3);
 228 
 229   gdImageDestroy (im2);
 230   gdImageDestroy (im3);
 231 
 232   /* */
 233   /*  Copy Blend */
 234   /* */
 235   in = fopen ("test/gdtest.png", "rb");
 236   if (!in)
 237     {
 238       fprintf (stderr, "gdtest.png does not exist!\n");
 239       exit (1);
 240     }
 241   im2 = gdImageCreateFromPng (in);
 242   fclose (in);
 243 
 244   im3 = gdImageCreate (100, 60);
 245   colRed = gdImageColorAllocate (im3, 255, 0, 0);
 246   colBlu = gdImageColorAllocate (im3, 0, 0, 255);
 247   gdImageFilledRectangle (im3, 0, 0, 49, 30, colRed);
 248   gdImageFilledRectangle (im3, 50, 30, 99, 59, colBlu);
 249 
 250   gdImageCopyMerge (im2, im3, 150, 200, 10, 10, 90, 50, 50);
 251   gdImageCopyMerge (im2, im3, 180, 70, 10, 10, 90, 50, 50);
 252 
 253   gdImageCopyMergeGray (im2, im3, 250, 160, 10, 10, 90, 50, 50);
 254   gdImageCopyMergeGray (im2, im3, 80, 70, 10, 10, 90, 50, 50);
 255 
 256   gdImageDestroy (im3);
 257 
 258   in = fopen ("test/gdtest_merge.png", "rb");
 259   if (!in)
 260     {
 261       fprintf (stderr, "gdtest_merge.png does not exist!\n");
 262       exit (1);
 263     }
 264   im3 = gdImageCreateFromPng (in);
 265   fclose (in);
 266 
 267   printf ("[Merged Image has %d colours]\n", im2->colorsTotal);
 268   CompareImages ("Merged (gdtest.png, gdtest_merge.png)", im2, im3);
 269 
 270   gdImageDestroy (im2);
 271   gdImageDestroy (im3);
 272 
 273 #ifdef HAVE_JPEG
 274   out = fopen ("test/gdtest.jpg", "wb");
 275   if (!out)
 276     {
 277       fprintf (stderr, "Can't create file test/gdtest.jpg.\n");
 278       exit (1);
 279     }
 280   gdImageJpeg (im, out, -1);
 281   fclose (out);
 282   in = fopen ("test/gdtest.jpg", "rb");
 283   if (!in)
 284     {
 285       fprintf (stderr, "Can't open file test/gdtest.jpg.\n");
 286       exit (1);
 287     }
 288   im2 = gdImageCreateFromJpeg (in);
 289   fclose (in);
 290   if (!im2)
 291     {
 292       fprintf (stderr, "gdImageCreateFromJpeg failed.\n");
 293       exit (1);
 294     }
 295   gdImageDestroy (im2);
 296   printf ("Created test/gdtest.jpg successfully. Compare this image\n"
 297           "to the input image manually. Some difference must be\n"
 298           "expected as JPEG is a lossy file format.\n");
 299 #endif /* HAVE_JPEG */
 300   /* Assume the color closest to black is the foreground
 301      color for the B&W wbmp image. */
 302   fprintf (stderr, "NOTE: the WBMP output image will NOT match the original unless the original\n"
 303            "is also black and white. This is OK!\n");
 304   foreground = gdImageColorClosest (im, 0, 0, 0);
 305   fprintf (stderr, "Foreground index is %d\n", foreground);
 306   if (foreground == -1)
 307     {
 308       fprintf (stderr, "Source image has no colors, skipping wbmp test.\n");
 309     }
 310   else
 311     {
 312       out = fopen ("test/gdtest.wbmp", "wb");
 313       if (!out)
 314         {
 315           fprintf (stderr, "Can't create file test/gdtest.wbmp.\n");
 316           exit (1);
 317         }
 318       gdImageWBMP (im, foreground, out);
 319       fclose (out);
 320       in = fopen ("test/gdtest.wbmp", "rb");
 321       if (!in)
 322         {
 323           fprintf (stderr, "Can't open file test/gdtest.wbmp.\n");
 324           exit (1);
 325         }
 326       im2 = gdImageCreateFromWBMP (in);
 327       fprintf (stderr, "WBMP has %d colors\n", gdImageColorsTotal (im2));
 328       fprintf (stderr, "WBMP colors are:\n");
 329       for (i = 0; (i < gdImageColorsTotal (im2)); i++)
 330         {
 331           fprintf (stderr, "%02X%02X%02X\n",
 332                    gdImageRed (im2, i),
 333                    gdImageGreen (im2, i),
 334                    gdImageBlue (im2, i));
 335         }
 336       fclose (in);
 337       if (!im2)
 338         {
 339           fprintf (stderr, "gdImageCreateFromWBMP failed.\n");
 340           exit (1);
 341         }
 342       CompareImages ("WBMP test (gdtest.png, gdtest.wbmp)", ref, im2);
 343       out = fopen ("test/gdtest_wbmp_to_png.png", "wb");
 344       if (!out)
 345         {
 346           fprintf (stderr, "Can't create file test/gdtest_wbmp_to_png.png.\n");
 347           exit (1);
 348         }
 349       gdImagePng (im2, out);
 350       fclose (out);
 351       gdImageDestroy (im2);
 352     }
 353   gdImageDestroy (im);
 354   gdImageDestroy (ref);
 355 
 356   return 0;
 357 }
 358 
 359 void
 360 CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2)
 361 {
 362   int cmpRes;
 363 
 364   cmpRes = gdImageCompare (im1, im2);
 365 
 366   if (cmpRes & GD_CMP_IMAGE)
 367     {
 368       printf ("%%%s: ERROR images differ: BAD\n", msg);
 369     }
 370   else if (cmpRes != 0)
 371     {
 372       printf ("%%%s: WARNING images differ: WARNING - Probably OK\n", msg);
 373     }
 374   else
 375     {
 376       printf ("%%%s: OK\n", msg);
 377       return;
 378     }
 379 
 380   if (cmpRes & (GD_CMP_SIZE_X + GD_CMP_SIZE_Y))
 381     {
 382       printf ("-%s: INFO image sizes differ\n", msg);
 383     }
 384 
 385   if (cmpRes & GD_CMP_NUM_COLORS)
 386     {
 387       printf ("-%s: INFO number of pallette entries differ %d Vs. %d\n", msg,
 388               im1->colorsTotal, im2->colorsTotal);
 389     }
 390 
 391   if (cmpRes & GD_CMP_COLOR)
 392     {
 393       printf ("-%s: INFO actual colours of pixels differ\n", msg);
 394     }
 395 }
 396 
 397 
 398 static int
 399 freadWrapper (void *context, char *buf, int len)
 400 {
 401   int got = fread (buf, 1, len, (FILE *) context);
 402   return got;
 403 }
 404 
 405 static int
 406 fwriteWrapper (void *context, const char *buffer, int len)
 407 {
 408   return fwrite (buffer, 1, len, (FILE *) context);
 409 }

/* [<][>][^][v][top][bottom][index][help] */