xref: /PHP-8.4/ext/gd/libgd/gdtest.c (revision afdaa911)
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 palette 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