1 #include <stdio.h>
2 #ifdef _WIN32
3 #include <process.h>
4 int
unlink(const char * filename)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
main(int argc,char ** argv)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
CompareImages(char * msg,gdImagePtr im1,gdImagePtr im2)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
freadWrapper(void * context,char * buf,int len)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
fwriteWrapper(void * context,const char * buffer,int len)406 fwriteWrapper (void *context, const char *buffer, int len)
407 {
408 return fwrite (buffer, 1, len, (FILE *) context);
409 }
410