Blame src/gdtest.c

Packit ed3af9
#ifdef HAVE_CONFIG_H
Packit ed3af9
#include "config.h"
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include <stdio.h>
Packit ed3af9
#include <stdlib.h>
Packit ed3af9
#ifdef _WIN32
Packit ed3af9
#include <process.h>
Packit ed3af9
int
Packit ed3af9
unlink (const char *filename)
Packit ed3af9
{
Packit ed3af9
	return _unlink (filename);
Packit ed3af9
}
Packit ed3af9
#else
Packit ed3af9
#include <unistd.h>		/* for getpid(), unlink() */
Packit ed3af9
#endif
Packit ed3af9
#include "gd.h"
Packit ed3af9
Packit ed3af9
void CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2);
Packit ed3af9
Packit ed3af9
static int freadWrapper (void *context, char *buf, int len);
Packit ed3af9
static int fwriteWrapper (void *context, const char *buffer, int len);
Packit ed3af9
Packit ed3af9
int
Packit ed3af9
main (int argc, char **argv)
Packit ed3af9
{
Packit ed3af9
#ifdef HAVE_LIBPNG
Packit ed3af9
	gdImagePtr im, ref, im2, im3;
Packit ed3af9
	FILE *in, *out;
Packit ed3af9
	void *iptr;
Packit ed3af9
	int sz;
Packit ed3af9
	char of[256];
Packit ed3af9
	int colRed, colBlu;
Packit ed3af9
	gdSource imgsrc;
Packit ed3af9
	gdSink imgsnk;
Packit ed3af9
	int foreground;
Packit ed3af9
	int i;
Packit ed3af9
	if (argc != 2) {
Packit ed3af9
		fprintf(stderr, "Usage: gdtest filename.png\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	in = fopen (argv[1], "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "Input file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im = gdImageCreateFromPng (in);
Packit ed3af9
Packit ed3af9
	rewind (in);
Packit ed3af9
	ref = gdImageCreateFromPng (in);
Packit ed3af9
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
               	exit (1);
Packit ed3af9
	}
Packit ed3af9
	if (!ref) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
               	exit (1);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	printf ("Reference File has %d Palette entries\n", ref->colorsTotal);
Packit ed3af9
Packit ed3af9
	CompareImages ("Initial Versions", ref, im);
Packit ed3af9
Packit ed3af9
Packit ed3af9
	/* */
Packit ed3af9
	/* Send to PNG File then Ptr */
Packit ed3af9
	/* */
Packit ed3af9
#ifdef VMS
Packit ed3af9
	sprintf (of, "%s-png", argv[1]);
Packit ed3af9
#else
Packit ed3af9
	sprintf (of, "%s.png", argv[1]);
Packit ed3af9
#endif
Packit ed3af9
	out = fopen (of, "wb");
Packit ed3af9
	if (!out) {
Packit ed3af9
		fprintf(stderr, "PNG Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	gdImagePng (im, out);
Packit ed3af9
	fclose (out);
Packit ed3af9
Packit ed3af9
	in = fopen (of, "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "PNG Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromPng (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	
Packit ed3af9
	CompareImages ("GD->PNG File->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	unlink (of);
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	/* 2.0.21: use the new From*Ptr functions */
Packit ed3af9
	iptr = gdImagePngPtr (im, &sz);
Packit ed3af9
	im2 = gdImageCreateFromPngPtr (sz, iptr);
Packit ed3af9
	gdFree (iptr);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPngPtr failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	CompareImages ("GD->PNG ptr->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	/* */
Packit ed3af9
	/* Send to GD2 File then Ptr */
Packit ed3af9
	/* */
Packit ed3af9
#ifdef VMS
Packit ed3af9
	sprintf (of, "%s-gd2", argv[1]);
Packit ed3af9
#else
Packit ed3af9
	sprintf (of, "%s.gd2", argv[1]);
Packit ed3af9
#endif
Packit ed3af9
	out = fopen (of, "wb");
Packit ed3af9
	if (!out) {
Packit ed3af9
		fprintf(stderr, "GD2 Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	gdImageGd2 (im, out, 128, 2);
Packit ed3af9
	fclose (out);
Packit ed3af9
Packit ed3af9
	in = fopen (of, "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "GD2 Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromGd2 (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromGd2 failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	CompareImages ("GD->GD2 File->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	unlink (of);
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	iptr = gdImageGd2Ptr (im, 128, 2, &sz);
Packit ed3af9
	/*printf("Got ptr %d (size %d)\n",iptr, sz); */
Packit ed3af9
	im2 = gdImageCreateFromGd2Ptr (sz, iptr);
Packit ed3af9
	gdFree (iptr);
Packit ed3af9
	/*printf("Got img2 %d\n",im2); */
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromGd2Ptr failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	CompareImages ("GD->GD2 ptr->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	/* */
Packit ed3af9
	/* Send to GD File then Ptr */
Packit ed3af9
	/* */
Packit ed3af9
#ifdef VMS
Packit ed3af9
	sprintf (of, "%s-gd", argv[1]);
Packit ed3af9
#else
Packit ed3af9
	sprintf (of, "%s.gd", argv[1]);
Packit ed3af9
#endif
Packit ed3af9
	out = fopen (of, "wb");
Packit ed3af9
	if (!out) {
Packit ed3af9
		fprintf(stderr, "GD Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	gdImageGd (im, out);
Packit ed3af9
	fclose (out);
Packit ed3af9
Packit ed3af9
	in = fopen (of, "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "GD Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromGd (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromGd failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	CompareImages ("GD->GD File->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	unlink (of);
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	iptr = gdImageGdPtr (im, &sz);
Packit ed3af9
	/*printf("Got ptr %d (size %d)\n",iptr, sz); */
Packit ed3af9
	im2 = gdImageCreateFromGdPtr (sz, iptr);
Packit ed3af9
	gdFree (iptr);
Packit ed3af9
	/*printf("Got img2 %d\n",im2); */
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromGdPtr failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	
Packit ed3af9
	CompareImages ("GD->GD ptr->GD", ref, im2);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
Packit ed3af9
	/*
Packit ed3af9
	 * Test gdImageCreateFromPngSource'
Packit ed3af9
	 */
Packit ed3af9
Packit ed3af9
	in = fopen (argv[1], "rb");
Packit ed3af9
Packit ed3af9
	imgsrc.source = freadWrapper;
Packit ed3af9
	imgsrc.context = in;
Packit ed3af9
	im2 = gdImageCreateFromPngSource (&imgsrc);
Packit ed3af9
	fclose (in);
Packit ed3af9
Packit ed3af9
	if (im2 == NULL) {
Packit ed3af9
		printf
Packit ed3af9
		("GD Source: ERROR Null returned by gdImageCreateFromPngSource\n");
Packit ed3af9
	} else {
Packit ed3af9
		CompareImages ("GD Source", ref, im2);
Packit ed3af9
		gdImageDestroy (im2);
Packit ed3af9
	};
Packit ed3af9
Packit ed3af9
Packit ed3af9
	/*
Packit ed3af9
	 * Test gdImagePngToSink'
Packit ed3af9
	 */
Packit ed3af9
#ifdef VMS
Packit ed3af9
	sprintf (of, "%s-snk", argv[1]);
Packit ed3af9
#else
Packit ed3af9
	sprintf (of, "%s.snk", argv[1]);
Packit ed3af9
#endif
Packit ed3af9
	out = fopen (of, "wb");
Packit ed3af9
	if (!out) {
Packit ed3af9
		fprintf (stderr,
Packit ed3af9
			"GD Sink: ERROR - GD Sink Output file does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	imgsnk.sink = fwriteWrapper;
Packit ed3af9
	imgsnk.context = out;
Packit ed3af9
	gdImagePngToSink (im, &imgsnk);
Packit ed3af9
	fclose (out);
Packit ed3af9
	in = fopen (of, "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf (stderr,
Packit ed3af9
		         "GD Sink: ERROR - GD Sink Output file does not exist!\n");
Packit ed3af9
	} else {
Packit ed3af9
		im2 = gdImageCreateFromPng (in);
Packit ed3af9
		fclose (in);
Packit ed3af9
		if (!im2) {
Packit ed3af9
			fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
			exit (1);
Packit ed3af9
		}
Packit ed3af9
		CompareImages ("GD Sink", ref, im2);
Packit ed3af9
		gdImageDestroy (im2);
Packit ed3af9
	};
Packit ed3af9
Packit ed3af9
	unlink (of);
Packit ed3af9
Packit ed3af9
	/* */
Packit ed3af9
	/*  Test Extraction */
Packit ed3af9
	/* */
Packit ed3af9
	in = fopen ("test/gdtest_200_300_150_100.png", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "gdtest_200_300_150_100.png does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromPng (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	in = fopen ("test/gdtest.gd2", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "gdtest.gd2 does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im3 = gdImageCreateFromGd2Part (in, 200, 300, 150, 100);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im3) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromGd2Part failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	CompareImages ("GD2Part (gdtest_200_300_150_100.png, gdtest.gd2(part))",
Packit ed3af9
	               im2, im3);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
	gdImageDestroy (im3);
Packit ed3af9
Packit ed3af9
	/* */
Packit ed3af9
	/*  Copy Blend */
Packit ed3af9
	/* */
Packit ed3af9
	in = fopen ("test/gdtest.png", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "gdtest.png does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromPng (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im3 = gdImageCreate (100, 60);
Packit ed3af9
	if (!im3) {
Packit ed3af9
		fprintf(stderr, "gdImageCreate failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	colRed = gdImageColorAllocate (im3, 255, 0, 0);
Packit ed3af9
	colBlu = gdImageColorAllocate (im3, 0, 0, 255);
Packit ed3af9
	gdImageFilledRectangle (im3, 0, 0, 49, 30, colRed);
Packit ed3af9
	gdImageFilledRectangle (im3, 50, 30, 99, 59, colBlu);
Packit ed3af9
Packit ed3af9
	gdImageCopyMerge (im2, im3, 150, 200, 10, 10, 90, 50, 50);
Packit ed3af9
	gdImageCopyMerge (im2, im3, 180, 70, 10, 10, 90, 50, 50);
Packit ed3af9
Packit ed3af9
	gdImageCopyMergeGray (im2, im3, 250, 160, 10, 10, 90, 50, 50);
Packit ed3af9
	gdImageCopyMergeGray (im2, im3, 80, 70, 10, 10, 90, 50, 50);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im3);
Packit ed3af9
Packit ed3af9
	in = fopen ("test/gdtest_merge.png", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "gdtest_merge.png does not exist!\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im3 = gdImageCreateFromPng (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im3) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromPng failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	printf ("[Merged Image has %d colours]\n", im2->colorsTotal);
Packit ed3af9
	CompareImages ("Merged (gdtest.png, gdtest_merge.png)", im2, im3);
Packit ed3af9
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
	gdImageDestroy (im3);
Packit ed3af9
Packit ed3af9
#ifdef HAVE_LIBJPEG
Packit ed3af9
	out = fopen ("test/gdtest.jpg", "wb");
Packit ed3af9
	if (!out) {
Packit ed3af9
		fprintf(stderr, "Can't create file test/gdtest.jpg.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	gdImageJpeg (im, out, -1);
Packit ed3af9
	fclose (out);
Packit ed3af9
	in = fopen ("test/gdtest.jpg", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "Can't open file test/gdtest.jpg.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	im2 = gdImageCreateFromJpeg (in);
Packit ed3af9
	fclose (in);
Packit ed3af9
	if (!im2) {
Packit ed3af9
		fprintf(stderr, "gdImageCreateFromJpeg failed.\n");
Packit ed3af9
		exit (1);
Packit ed3af9
	}
Packit ed3af9
	gdImageDestroy (im2);
Packit ed3af9
	printf ("Created test/gdtest.jpg successfully. Compare this image\n"
Packit ed3af9
	        "to the input image manually. Some difference must be\n"
Packit ed3af9
	        "expected as JPEG is a lossy file format.\n");
Packit ed3af9
#endif /* HAVE_LIBJPEG */
Packit ed3af9
	/* Assume the color closest to black is the foreground
Packit ed3af9
	   color for the B&W wbmp image. */
Packit ed3af9
	fprintf (stderr,
Packit ed3af9
	         "NOTE: the WBMP output image will NOT match the original unless the original\n"
Packit ed3af9
	         "is also black and white. This is OK!\n");
Packit ed3af9
	foreground = gdImageColorClosest (im, 0, 0, 0);
Packit ed3af9
	fprintf(stderr, "Foreground index is %d\n", foreground);
Packit ed3af9
	if (foreground == -1) {
Packit ed3af9
		fprintf(stderr, "Source image has no colors, skipping wbmp test.\n");
Packit ed3af9
	} else {
Packit ed3af9
		out = fopen ("test/gdtest.wbmp", "wb");
Packit ed3af9
		if (!out) {
Packit ed3af9
			fprintf(stderr, "Can't create file test/gdtest.wbmp.\n");
Packit ed3af9
			exit (1);
Packit ed3af9
		}
Packit ed3af9
		gdImageWBMP (im, foreground, out);
Packit ed3af9
		fclose (out);
Packit ed3af9
		in = fopen ("test/gdtest.wbmp", "rb");
Packit ed3af9
		if (!in) {
Packit ed3af9
			fprintf(stderr, "Can't open file test/gdtest.wbmp.\n");
Packit ed3af9
			exit (1);
Packit ed3af9
		}
Packit ed3af9
		im2 = gdImageCreateFromWBMP (in);
Packit ed3af9
		fclose (in);
Packit ed3af9
		if (!im2) {
Packit ed3af9
			fprintf(stderr, "gdImageCreateFromWBMP failed.\n");
Packit ed3af9
			exit (1);
Packit ed3af9
		}
Packit ed3af9
		fprintf(stderr, "WBMP has %d colors\n", gdImageColorsTotal (im2));
Packit ed3af9
		fprintf(stderr, "WBMP colors are:\n");
Packit ed3af9
		for (i = 0; (i < gdImageColorsTotal (im2)); i++) {
Packit ed3af9
			fprintf(stderr, "%02X%02X%02X\n",
Packit ed3af9
			         gdImageRed (im2, i),
Packit ed3af9
			         gdImageGreen (im2, i), gdImageBlue (im2, i));
Packit ed3af9
		}
Packit ed3af9
		CompareImages ("WBMP test (gdtest.png, gdtest.wbmp)", ref, im2);
Packit ed3af9
		out = fopen ("test/gdtest_wbmp_to_png.png", "wb");
Packit ed3af9
		if (!out) {
Packit ed3af9
			fprintf (stderr,
Packit ed3af9
			         "Can't create file test/gdtest_wbmp_to_png.png.\n");
Packit ed3af9
			exit (1);
Packit ed3af9
		}
Packit ed3af9
		gdImagePng (im2, out);
Packit ed3af9
		fclose (out);
Packit ed3af9
		gdImageDestroy (im2);
Packit ed3af9
	}
Packit ed3af9
	gdImageDestroy (im);
Packit ed3af9
	gdImageDestroy (ref);
Packit ed3af9
#else
Packit ed3af9
	fprintf(stderr, "No PNG library support.\n");
Packit ed3af9
#endif /* HAVE_LIBPNG */
Packit ed3af9
Packit ed3af9
	return 0;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
void
Packit ed3af9
CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2)
Packit ed3af9
{
Packit ed3af9
	int cmpRes;
Packit ed3af9
Packit ed3af9
	cmpRes = gdImageCompare (im1, im2);
Packit ed3af9
Packit ed3af9
	if (cmpRes & GD_CMP_IMAGE) {
Packit ed3af9
		printf ("%%%s: ERROR images differ: BAD\n", msg);
Packit ed3af9
	} else if (cmpRes != 0) {
Packit ed3af9
		printf ("%%%s: WARNING images differ: WARNING - Probably OK\n", msg);
Packit ed3af9
	} else {
Packit ed3af9
		printf ("%%%s: OK\n", msg);
Packit ed3af9
		return;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (cmpRes & (GD_CMP_SIZE_X + GD_CMP_SIZE_Y)) {
Packit ed3af9
		printf ("-%s: INFO image sizes differ\n", msg);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (cmpRes & GD_CMP_NUM_COLORS) {
Packit ed3af9
		printf ("-%s: INFO number of palette entries differ %d Vs. %d\n", msg,
Packit ed3af9
		        im1->colorsTotal, im2->colorsTotal);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (cmpRes & GD_CMP_COLOR) {
Packit ed3af9
		printf ("-%s: INFO actual colours of pixels differ\n", msg);
Packit ed3af9
	}
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
Packit ed3af9
static int
Packit ed3af9
freadWrapper (void *context, char *buf, int len)
Packit ed3af9
{
Packit ed3af9
	int got = fread (buf, 1, len, (FILE *) context);
Packit ed3af9
	return got;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
static int
Packit ed3af9
fwriteWrapper (void *context, const char *buffer, int len)
Packit ed3af9
{
Packit ed3af9
	return fwrite (buffer, 1, len, (FILE *) context);
Packit ed3af9
}