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