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>