php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
gdtest.c
Go to the documentation of this file.
1#include <stdio.h>
2#ifdef _WIN32
3#include <process.h>
4int
5unlink (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
14void CompareImages (char *msg, gdImagePtr im1, gdImagePtr im2);
15
16static int freadWrapper (void *context, char *buf, int len);
17static int fwriteWrapper (void *context, const char *buffer, int len);
18
19int
20main (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
359void
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
398static int
399freadWrapper (void *context, char *buf, int len)
400{
401 int got = fread (buf, 1, len, (FILE *) context);
402 return got;
403}
404
405static int
406fwriteWrapper (void *context, const char *buffer, int len)
407{
408 return fwrite (buffer, 1, len, (FILE *) context);
409}
size_t len
Definition apprentice.c:174
unlink(string $filename, $context=null)
rewind($stream)
fprintf($stream, string $format, mixed ... $values)
printf(string $format, mixed ... $values)
fwrite($stream, string $data, ?int $length=null)
fclose($stream)
fopen(string $filename, string $mode, bool $use_include_path=false, $context=null)
fread($stream, int $length)
zend_ffi_ctype_name_buf buf
Definition ffi.c:4685
#define gdImageBlue(im, c)
Definition gd.h:775
void * gdImagePngPtr(gdImagePtr im, int *size)
gdImagePtr gdImageCreateFromPngCtx(gdIOCtxPtr in)
gdImagePtr gdImageCreateFromGd2Ctx(gdIOCtxPtr in)
Definition gd_gd2.c:267
void * gdImageGdPtr(gdImagePtr im, int *size)
Definition gd_gd.c:272
#define GD_CMP_SIZE_X
Definition gd.h:933
#define GD_CMP_SIZE_Y
Definition gd.h:934
gdImagePtr gdImageCreateFromGd2Part(FILE *in, int srcx, int srcy, int w, int h)
Definition gd_gd2.c:422
void gdImagePng(gdImagePtr im, FILE *out)
gdImagePtr gdImageCreateFromJpeg(FILE *infile)
void gdImageGd(gdImagePtr im, FILE *out)
Definition gd_gd.c:265
#define GD_CMP_NUM_COLORS
Definition gd.h:931
#define gdImageColorsTotal(im)
Definition gd.h:770
gdImagePtr gdImageCreateFromPngSource(gdSourcePtr in)
Definition gd_ss.c:43
gdImagePtr gdImageCreateFromWBMP(FILE *inFile)
Definition gd_wbmp.c:183
void gdImageJpeg(gdImagePtr im, FILE *out, int quality)
#define gdImageGreen(im, c)
Definition gd.h:773
void gdImageWBMP(gdImagePtr image, int fg, FILE *out)
Definition gd_wbmp.c:205
#define GD_CMP_IMAGE
Definition gd.h:930
gdIOCtx * gdNewDynamicCtx(int, void *)
Definition gd_io_dp.c:65
gdImagePtr gdImageCreateFromGdCtx(gdIOCtxPtr in)
Definition gd_gd.c:165
#define GD_CMP_COLOR
Definition gd.h:932
gdImagePtr gdImageCreateFromGd(FILE *in)
Definition gd_gd.c:142
void gdImageGd2(gdImagePtr im, FILE *out, int cs, int fmt)
Definition gd_gd2.c:832
void * gdImageGd2Ptr(gdImagePtr im, int cs, int fmt, int *size)
Definition gd_gd2.c:841
gdImagePtr gdImageCreateFromGd2(FILE *in)
Definition gd_gd2.c:245
gdImagePtr gdImageCreateFromPng(FILE *fd)
#define gdImageRed(im, c)
Definition gd.h:771
void gdImagePngToSink(gdImagePtr im, gdSinkPtr out)
Definition gd_ss.c:39
gdImage * gdImagePtr
Definition gd.h:248
struct gdIOCtx * gdIOCtxPtr
Definition gd_io.h:25
#define NULL
Definition gdcache.h:45
int main(void)
Definition gddemo.c:7
void CompareImages(char *msg, gdImagePtr im1, gdImagePtr im2)
Definition gdtest.c:360
gdImagePtr gdImageCreate(int sx, int sy)
Definition gd.c:141
void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color)
Definition gd.c:2307
void gdImageDestroy(gdImagePtr im)
Definition gd.c:247
int gdImageColorClosest(gdImagePtr im, int r, int g, int b)
Definition gd.c:271
int gdImageColorAllocate(gdImagePtr im, int r, int g, int b)
Definition gd.c:489
void gdImageCopyMerge(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int w, int h, int pct)
Definition gd.c:2393
void gdImageCopyMergeGray(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int w, int h, int pct)
Definition gd.c:2433
int gdImageCompare(gdImagePtr im1, gdImagePtr im2)
Definition gd.c:2920
char * msg
Definition phpdbg.h:289
Definition file.h:177
Definition dce.c:49
void(* gd_free)(struct gdIOCtx *)
Definition gd_io.h:20
int colorsTotal
Definition gd.h:178
Definition gd.h:655
int(* sink)(void *context, const char *buffer, int len)
Definition gd.h:656
void * context
Definition gd.h:657
Definition gd.h:388
int(* source)(void *context, char *buffer, int len)
Definition gd.h:389
void * context
Definition gd.h:390
exit(string|int $status=0)
#define snprintf
out($f, $s)