Annotation of embedaddon/php/ext/gd/libgd/gdtest.c, revision 1.1.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>