Annotation of embedaddon/php/ext/gd/libgd/webpng.c, revision 1.1.1.1
1.1 misho 1: /* Bring in the gd library functions */
2: #include "gd.h"
3:
4: /* Bring in standard I/O and string manipulation functions */
5: #include <stdio.h>
6: #include <stdlib.h> /* for atoi() */
7: #include <string.h>
8:
9: #ifdef _WIN32
10: #include <process.h>
11: int
12: getpid ()
13: {
14: return _getpid ();
15: }
16: #else
17: #include <unistd.h> /* for getpid(), unlink() */
18: #endif
19: int
20: main (int argc, char **argv)
21: {
22: FILE *in;
23: FILE *out;
24: char outFn[20];
25: int useStdinStdout = 0;
26:
27: /* Declare our image pointer */
28: gdImagePtr im = 0;
29: int i;
30: /* We'll clear 'no' once we know the user has made a
31: reasonable request. */
32: int no = 1;
33: /* We'll set 'write' once we know the user's request
34: requires that the image be written back to disk. */
35: int write = 0;
36: /* C programs always get at least one argument; we want at
37: least one more (the image), more in practice. */
38: if (argc < 2 || !strcmp (argv[1], "--help"))
39: {
40: no = 1;
41: goto usage;
42: }
43:
44: /* The last argument should be the image. Open the file. */
45: if (strcmp ("-", argv[argc - 1]) == 0)
46: { /* - is synonymous with STDIN */
47: useStdinStdout = 1;
48: in = stdin;
49: }
50: else
51: {
52: in = fopen (argv[argc - 1], "rb");
53: }
54: if (!in)
55: {
56: fprintf (stderr,
57: "Error: can't open file %s.\n", argv[argc - 1]);
58: exit (1);
59: }
60: /* Now load the image. */
61: im = gdImageCreateFromPng (in);
62: fclose (in);
63: /* If the load failed, it must not be a PNG file. */
64: if (!im)
65: {
66: fprintf (stderr,
67: "Error: %s is not a valid PNG file.\n", argv[argc - 1]);
68: exit (1);
69: }
70: /* Consider each argument in turn. */
71: for (i = 1; (i < (argc - 1)); i++)
72: {
73: /* -i turns on and off interlacing. */
74: if (!strcmp (argv[i], "--help"))
75: {
76: /* Every program should use this for help! :) */
77: no = 1;
78: goto usage;
79: }
80: else if (!strcmp (argv[i], "-i"))
81: {
82: if (i == (argc - 2))
83: {
84: fprintf (stderr,
85: "Error: -i specified without y or n.\n");
86: no = 1;
87: goto usage;
88: }
89: if (!strcmp (argv[i + 1], "y"))
90: {
91: /* Set interlace. */
92: gdImageInterlace (im, 1);
93: }
94: else if (!strcmp (argv[i + 1], "n"))
95: {
96: /* Clear interlace. */
97: gdImageInterlace (im, 0);
98: }
99: else
100: {
101: fprintf (stderr,
102: "Error: -i specified without y or n.\n");
103: no = 1;
104: goto usage;
105: }
106: i++;
107: no = 0;
108: write = 1;
109: }
110: else if (!strcmp (argv[i], "-t"))
111: {
112: /* Set transparent index (or none). */
113: int index;
114: if (i == (argc - 2))
115: {
116: fprintf (stderr,
117: "Error: -t specified without a color table index.\n");
118: no = 1;
119: goto usage;
120: }
121: if (!strcmp (argv[i + 1], "none"))
122: {
123: /* -1 means not transparent. */
124: gdImageColorTransparent (im, -1);
125: }
126: else
127: {
128: /* OK, get an integer and set the index. */
129: index = atoi (argv[i + 1]);
130: gdImageColorTransparent (im, index);
131: }
132: i++;
133: write = 1;
134: no = 0;
135: }
136: else if (!strcmp (argv[i], "-l"))
137: {
138: /* List the colors in the color table. */
139: int j;
140: if (!im->trueColor)
141: {
142: /* Tabs used below. */
143: printf ("Index Red Green Blue Alpha\n");
144: for (j = 0; (j < gdImageColorsTotal (im)); j++)
145: {
146: /* Use access macros to learn colors. */
147: printf ("%d %d %d %d %d\n",
148: j,
149: gdImageRed (im, j),
150: gdImageGreen (im, j),
151: gdImageBlue (im, j),
152: gdImageAlpha (im, j));
153: }
154: }
155: else
156: {
157: printf ("Truecolor image, no palette entries to list.\n");
158: }
159: no = 0;
160: }
161: else if (!strcmp (argv[i], "-d"))
162: {
163: /* Output dimensions, etc. */
164: int t;
165: printf ("Width: %d Height: %d Colors: %d\n",
166: gdImageSX (im), gdImageSY (im),
167: gdImageColorsTotal (im));
168: t = gdImageGetTransparent (im);
169: if (t != (-1))
170: {
171: printf ("First 100%% transparent index: %d\n", t);
172: }
173: else
174: {
175: /* -1 means the image is not transparent. */
176: printf ("First 100%% transparent index: none\n");
177: }
178: if (gdImageGetInterlaced (im))
179: {
180: printf ("Interlaced: yes\n");
181: }
182: else
183: {
184: printf ("Interlaced: no\n");
185: }
186: no = 0;
187: }
188: else if (!strcmp(argv[i], "-a"))
189: {
190: int maxx, maxy, x, y, alpha, pix, nalpha = 0;
191:
192: maxx = gdImageSX(im);
193: maxy = gdImageSY(im);
194:
195: printf("alpha channel information:\n");
196:
197: if (im->trueColor) {
198: for (y = 0; y < maxy; y++) {
199: for (x = 0; x < maxx; x++) {
200: pix = gdImageGetPixel(im, x, y);
201: alpha = gdTrueColorGetAlpha(pix);
202:
203: if (alpha > gdAlphaOpaque) {
204: /* Use access macros to learn colors. */
205: printf ("%d %d %d %d\n",
206: gdTrueColorGetRed(pix),
207: gdTrueColorGetGreen(pix),
208: gdTrueColorGetBlue(pix),
209: alpha);
210: nalpha++;
211: }
212:
213: }
214: }
215: }
216: else
217: printf("NOT a true color image\n");
218: no = 0;
219: printf("%d alpha channels\n", nalpha);
220:
221: }
222: else
223: {
224: fprintf (stderr, "Unknown argument: %s\n", argv[i]);
225: break;
226: }
227: }
228: usage:
229: if (no)
230: {
231: /* If the command failed, output an explanation. */
232: fprintf (stderr,
233: "Usage: webpng [-i y|n ] [-l] [-t index|none ] [-d] pngname.png\n"
234:
235: " -i [y|n] Turns on/off interlace\n"
236: " -l Prints the table of color indexes\n"
237: " -t [index] Set the transparent color to the specified index (0-255 or \"none\")\n"
238: " -d Reports the dimensions and other characteristics of the image.\n"
239: " -a Prints all alpha channels that are not 100%% opaque.\n"
240: "\n"
241: "If you specify '-' as the input file, stdin/stdout will be used input/output.\n"
242: );
243: }
244: if (write)
245: {
246: if (useStdinStdout)
247: {
248: out = stdout;
249: }
250: else
251: {
252: /* Open a temporary file. */
253:
254: /* "temp.tmp" is not good temporary filename. */
255: snprintf (outFn, sizeof(outFn), "webpng.tmp%d", getpid ());
256: out = fopen (outFn, "wb");
257:
258: if (!out)
259: {
260: fprintf (stderr,
261: "Unable to write to %s -- exiting\n", outFn);
262: exit (1);
263: }
264: }
265:
266: /* Write the new PNG. */
267: gdImagePng (im, out);
268:
269: if (!useStdinStdout)
270: {
271: fclose (out);
272: /* Erase the old PNG. */
273: unlink (argv[argc - 1]);
274: /* Rename the new to the old. */
275: if (rename (outFn, argv[argc - 1]) != 0)
276: {
277: perror ("rename");
278: exit (1);
279: }
280: }
281: }
282: /* Delete the image from memory. */
283: if (im)
284: {
285: gdImageDestroy (im);
286: }
287: /* All's well that ends well. */
288: return 0;
289: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>