Annotation of embedaddon/php/ext/gd/libgd/gdtest.c, revision 1.1

1.1     ! misho       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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>