mirror of
https://github.com/php/php-src.git
synced 2024-12-11 19:04:38 +08:00
7a8cade379
This initial checkin has no changes to any of the libgd code so it can be used as a basis for diffs. It also will not build currently because of this. The PHP gd checks need to be incorporated along with a bit of other config magic. It also shouldn't break the build and will only take effect if you use --with-gd=php right now.
410 lines
9.0 KiB
C
410 lines
9.0 KiB
C
#include <stdio.h>
|
|
#ifdef _WIN32
|
|
#include <process.h>
|
|
int
|
|
unlink (const char *filename)
|
|
{
|
|
return _unlink (filename);
|
|
}
|
|
#else
|
|
#include <unistd.h> /* for getpid(), unlink() */
|
|
#endif
|
|
#include "gd.h"
|
|
|
|
void CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2);
|
|
|
|
static int freadWrapper (void *context, char *buf, int len);
|
|
static int fwriteWrapper (void *context, const char *buffer, int len);
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
gdImagePtr im, ref, im2, im3;
|
|
FILE *in, *out;
|
|
void *iptr;
|
|
int sz;
|
|
gdIOCtxPtr ctx;
|
|
char of[256];
|
|
int colRed, colBlu;
|
|
gdSource imgsrc;
|
|
gdSink imgsnk;
|
|
int foreground;
|
|
int i;
|
|
if (argc != 2)
|
|
{
|
|
fprintf (stderr, "Usage: gdtest filename.png\n");
|
|
exit (1);
|
|
}
|
|
in = fopen (argv[1], "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "Input file does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im = gdImageCreateFromPng (in);
|
|
|
|
rewind (in);
|
|
ref = gdImageCreateFromPng (in);
|
|
|
|
fclose (in);
|
|
|
|
printf ("Reference File has %d Palette entries\n", ref->colorsTotal);
|
|
|
|
CompareImages ("Initial Versions", ref, im);
|
|
|
|
|
|
/* */
|
|
/* Send to PNG File then Ptr */
|
|
/* */
|
|
sprintf (of, "%s.png", argv[1]);
|
|
out = fopen (of, "wb");
|
|
gdImagePng (im, out);
|
|
fclose (out);
|
|
|
|
in = fopen (of, "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "PNG Output file does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromPng (in);
|
|
fclose (in);
|
|
|
|
CompareImages ("GD->PNG File->GD", ref, im2);
|
|
|
|
unlink (of);
|
|
gdImageDestroy (im2);
|
|
|
|
iptr = gdImagePngPtr (im, &sz);
|
|
ctx = gdNewDynamicCtx (sz, iptr);
|
|
im2 = gdImageCreateFromPngCtx (ctx);
|
|
|
|
CompareImages ("GD->PNG ptr->GD", ref, im2);
|
|
|
|
gdImageDestroy (im2);
|
|
ctx->free (ctx);
|
|
|
|
|
|
/* */
|
|
/* Send to GD2 File then Ptr */
|
|
/* */
|
|
sprintf (of, "%s.gd2", argv[1]);
|
|
out = fopen (of, "wb");
|
|
gdImageGd2 (im, out, 128, 2);
|
|
fclose (out);
|
|
|
|
in = fopen (of, "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "GD2 Output file does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromGd2 (in);
|
|
fclose (in);
|
|
|
|
CompareImages ("GD->GD2 File->GD", ref, im2);
|
|
|
|
unlink (of);
|
|
gdImageDestroy (im2);
|
|
|
|
iptr = gdImageGd2Ptr (im, 128, 2, &sz);
|
|
/*printf("Got ptr %d (size %d)\n",iptr, sz); */
|
|
ctx = gdNewDynamicCtx (sz, iptr);
|
|
/*printf("Got ctx %d\n",ctx); */
|
|
im2 = gdImageCreateFromGd2Ctx (ctx);
|
|
/*printf("Got img2 %d\n",im2); */
|
|
|
|
CompareImages ("GD->GD2 ptr->GD", ref, im2);
|
|
|
|
gdImageDestroy (im2);
|
|
ctx->free (ctx);
|
|
|
|
|
|
/* */
|
|
/* Send to GD File then Ptr */
|
|
/* */
|
|
sprintf (of, "%s.gd", argv[1]);
|
|
out = fopen (of, "wb");
|
|
gdImageGd (im, out);
|
|
fclose (out);
|
|
|
|
in = fopen (of, "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "GD Output file does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromGd (in);
|
|
fclose (in);
|
|
|
|
CompareImages ("GD->GD File->GD", ref, im2);
|
|
|
|
unlink (of);
|
|
gdImageDestroy (im2);
|
|
|
|
iptr = gdImageGdPtr (im, &sz);
|
|
/*printf("Got ptr %d (size %d)\n",iptr, sz); */
|
|
ctx = gdNewDynamicCtx (sz, iptr);
|
|
/*printf("Got ctx %d\n",ctx); */
|
|
im2 = gdImageCreateFromGdCtx (ctx);
|
|
/*printf("Got img2 %d\n",im2); */
|
|
|
|
CompareImages ("GD->GD ptr->GD", ref, im2);
|
|
|
|
gdImageDestroy (im2);
|
|
ctx->free (ctx);
|
|
|
|
/*
|
|
** Test gdImageCreateFromPngSource'
|
|
* */
|
|
|
|
in = fopen (argv[1], "rb");
|
|
|
|
imgsrc.source = freadWrapper;
|
|
imgsrc.context = in;
|
|
im2 = gdImageCreateFromPngSource (&imgsrc);
|
|
fclose (in);
|
|
|
|
if (im2 == NULL)
|
|
{
|
|
printf ("GD Source: ERROR Null returned by gdImageCreateFromPngSource\n");
|
|
}
|
|
else
|
|
{
|
|
CompareImages ("GD Source", ref, im2);
|
|
gdImageDestroy (im2);
|
|
};
|
|
|
|
|
|
/*
|
|
** Test gdImagePngToSink'
|
|
* */
|
|
|
|
sprintf (of, "%s.snk", argv[1]);
|
|
out = fopen (of, "wb");
|
|
imgsnk.sink = fwriteWrapper;
|
|
imgsnk.context = out;
|
|
gdImagePngToSink (im, &imgsnk);
|
|
fclose (out);
|
|
in = fopen (of, "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "GD Sink: ERROR - GD Sink Output file does not exist!\n");
|
|
}
|
|
else
|
|
{
|
|
im2 = gdImageCreateFromPng (in);
|
|
fclose (in);
|
|
|
|
CompareImages ("GD Sink", ref, im2);
|
|
gdImageDestroy (im2);
|
|
};
|
|
|
|
unlink (of);
|
|
|
|
/* */
|
|
/* Test Extraction */
|
|
/* */
|
|
in = fopen ("test/gdtest_200_300_150_100.png", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "gdtest_200_300_150_100.png does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromPng (in);
|
|
fclose (in);
|
|
|
|
|
|
in = fopen ("test/gdtest.gd2", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "gdtest.gd2 does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im3 = gdImageCreateFromGd2Part (in, 200, 300, 150, 100);
|
|
fclose (in);
|
|
|
|
CompareImages ("GD2Part (gdtest_200_300_150_100.png, gdtest.gd2(part))", im2, im3);
|
|
|
|
gdImageDestroy (im2);
|
|
gdImageDestroy (im3);
|
|
|
|
/* */
|
|
/* Copy Blend */
|
|
/* */
|
|
in = fopen ("test/gdtest.png", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "gdtest.png does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromPng (in);
|
|
fclose (in);
|
|
|
|
im3 = gdImageCreate (100, 60);
|
|
colRed = gdImageColorAllocate (im3, 255, 0, 0);
|
|
colBlu = gdImageColorAllocate (im3, 0, 0, 255);
|
|
gdImageFilledRectangle (im3, 0, 0, 49, 30, colRed);
|
|
gdImageFilledRectangle (im3, 50, 30, 99, 59, colBlu);
|
|
|
|
gdImageCopyMerge (im2, im3, 150, 200, 10, 10, 90, 50, 50);
|
|
gdImageCopyMerge (im2, im3, 180, 70, 10, 10, 90, 50, 50);
|
|
|
|
gdImageCopyMergeGray (im2, im3, 250, 160, 10, 10, 90, 50, 50);
|
|
gdImageCopyMergeGray (im2, im3, 80, 70, 10, 10, 90, 50, 50);
|
|
|
|
gdImageDestroy (im3);
|
|
|
|
in = fopen ("test/gdtest_merge.png", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "gdtest_merge.png does not exist!\n");
|
|
exit (1);
|
|
}
|
|
im3 = gdImageCreateFromPng (in);
|
|
fclose (in);
|
|
|
|
printf ("[Merged Image has %d colours]\n", im2->colorsTotal);
|
|
CompareImages ("Merged (gdtest.png, gdtest_merge.png)", im2, im3);
|
|
|
|
gdImageDestroy (im2);
|
|
gdImageDestroy (im3);
|
|
|
|
#ifdef HAVE_JPEG
|
|
out = fopen ("test/gdtest.jpg", "wb");
|
|
if (!out)
|
|
{
|
|
fprintf (stderr, "Can't create file test/gdtest.jpg.\n");
|
|
exit (1);
|
|
}
|
|
gdImageJpeg (im, out, -1);
|
|
fclose (out);
|
|
in = fopen ("test/gdtest.jpg", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "Can't open file test/gdtest.jpg.\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromJpeg (in);
|
|
fclose (in);
|
|
if (!im2)
|
|
{
|
|
fprintf (stderr, "gdImageCreateFromJpeg failed.\n");
|
|
exit (1);
|
|
}
|
|
gdImageDestroy (im2);
|
|
printf ("Created test/gdtest.jpg successfully. Compare this image\n"
|
|
"to the input image manually. Some difference must be\n"
|
|
"expected as JPEG is a lossy file format.\n");
|
|
#endif /* HAVE_JPEG */
|
|
/* Assume the color closest to black is the foreground
|
|
color for the B&W wbmp image. */
|
|
fprintf (stderr, "NOTE: the WBMP output image will NOT match the original unless the original\n"
|
|
"is also black and white. This is OK!\n");
|
|
foreground = gdImageColorClosest (im, 0, 0, 0);
|
|
fprintf (stderr, "Foreground index is %d\n", foreground);
|
|
if (foreground == -1)
|
|
{
|
|
fprintf (stderr, "Source image has no colors, skipping wbmp test.\n");
|
|
}
|
|
else
|
|
{
|
|
out = fopen ("test/gdtest.wbmp", "wb");
|
|
if (!out)
|
|
{
|
|
fprintf (stderr, "Can't create file test/gdtest.wbmp.\n");
|
|
exit (1);
|
|
}
|
|
gdImageWBMP (im, foreground, out);
|
|
fclose (out);
|
|
in = fopen ("test/gdtest.wbmp", "rb");
|
|
if (!in)
|
|
{
|
|
fprintf (stderr, "Can't open file test/gdtest.wbmp.\n");
|
|
exit (1);
|
|
}
|
|
im2 = gdImageCreateFromWBMP (in);
|
|
fprintf (stderr, "WBMP has %d colors\n", gdImageColorsTotal (im2));
|
|
fprintf (stderr, "WBMP colors are:\n");
|
|
for (i = 0; (i < gdImageColorsTotal (im2)); i++)
|
|
{
|
|
fprintf (stderr, "%02X%02X%02X\n",
|
|
gdImageRed (im2, i),
|
|
gdImageGreen (im2, i),
|
|
gdImageBlue (im2, i));
|
|
}
|
|
fclose (in);
|
|
if (!im2)
|
|
{
|
|
fprintf (stderr, "gdImageCreateFromWBMP failed.\n");
|
|
exit (1);
|
|
}
|
|
CompareImages ("WBMP test (gdtest.png, gdtest.wbmp)", ref, im2);
|
|
out = fopen ("test/gdtest_wbmp_to_png.png", "wb");
|
|
if (!out)
|
|
{
|
|
fprintf (stderr, "Can't create file test/gdtest_wbmp_to_png.png.\n");
|
|
exit (1);
|
|
}
|
|
gdImagePng (im2, out);
|
|
fclose (out);
|
|
gdImageDestroy (im2);
|
|
}
|
|
gdImageDestroy (im);
|
|
gdImageDestroy (ref);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2)
|
|
{
|
|
int cmpRes;
|
|
|
|
cmpRes = gdImageCompare (im1, im2);
|
|
|
|
if (cmpRes & GD_CMP_IMAGE)
|
|
{
|
|
printf ("%%%s: ERROR images differ: BAD\n", msg);
|
|
}
|
|
else if (cmpRes != 0)
|
|
{
|
|
printf ("%%%s: WARNING images differ: WARNING - Probably OK\n", msg);
|
|
}
|
|
else
|
|
{
|
|
printf ("%%%s: OK\n", msg);
|
|
return;
|
|
}
|
|
|
|
if (cmpRes & (GD_CMP_SIZE_X + GD_CMP_SIZE_Y))
|
|
{
|
|
printf ("-%s: INFO image sizes differ\n", msg);
|
|
}
|
|
|
|
if (cmpRes & GD_CMP_NUM_COLORS)
|
|
{
|
|
printf ("-%s: INFO number of pallette entries differ %d Vs. %d\n", msg,
|
|
im1->colorsTotal, im2->colorsTotal);
|
|
}
|
|
|
|
if (cmpRes & GD_CMP_COLOR)
|
|
{
|
|
printf ("-%s: INFO actual colours of pixels differ\n", msg);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
freadWrapper (void *context, char *buf, int len)
|
|
{
|
|
int got = fread (buf, 1, len, (FILE *) context);
|
|
return got;
|
|
}
|
|
|
|
static int
|
|
fwriteWrapper (void *context, const char *buffer, int len)
|
|
{
|
|
return fwrite (buffer, 1, len, (FILE *) context);
|
|
}
|