summaryrefslogtreecommitdiff
path: root/src/webpng.c
diff options
context:
space:
mode:
authorpierre <none@none>2006-04-05 15:35:53 +0000
committerpierre <none@none>2006-04-05 15:35:53 +0000
commit084ba37adc6c46cf5536ad11b7dbbeb01364cde1 (patch)
tree84753c7aca35269a4a96051dc57f3a8568c80abb /src/webpng.c
parentec7d9f2a8062276d8c427e6a9b4ed943d8bf8b23 (diff)
downloadlibgd-084ba37adc6c46cf5536ad11b7dbbeb01364cde1.tar.gz
- sync to 1.6.0GD_1_6_0
Diffstat (limited to 'src/webpng.c')
-rw-r--r--src/webpng.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/webpng.c b/src/webpng.c
new file mode 100644
index 0000000..3ddd9f6
--- /dev/null
+++ b/src/webpng.c
@@ -0,0 +1,191 @@
+/* Bring in the gd library functions */
+#include "gd.h"
+
+/* Bring in standard I/O and string manipulation functions */
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+ FILE *in;
+ FILE *out;
+ char outFn[20];
+ int useStdinStdout=0;
+
+ /* Declare our image pointer */
+ gdImagePtr im = 0;
+ int i;
+ /* We'll clear 'no' once we know the user has made a
+ reasonable request. */
+ int no = 1;
+ /* We'll set 'write' once we know the user's request
+ requires that the image be written back to disk. */
+ int write = 0;
+ /* C programs always get at least one argument; we want at
+ least one more (the image), more in practice. */
+ if (argc < 2 || !strcmp(argv[1], "--help")) {
+ no = 1;
+ goto usage;
+ }
+
+ /* The last argument should be the image. Open the file. */
+ if (strcmp("-", argv[argc-1])==0) { /* - is synonymous with STDIN */
+ useStdinStdout = 1;
+ in = stdin;
+ } else {
+ in = fopen(argv[argc-1], "rb");
+ }
+ if (!in) {
+ fprintf(stderr,
+ "Error: can't open file %s.\n", argv[argc-1]);
+ exit(1);
+ }
+ /* Now load the image. */
+ im = gdImageCreateFromPng(in);
+ fclose(in);
+ /* If the load failed, it must not be a PNG file. */
+ if (!im) {
+ fprintf(stderr,
+ "Error: %s is not a valid png file.\n", argv[argc-1]);
+ exit(1);
+ }
+ /* Consider each argument in turn. */
+ for (i=1; (i < (argc-1)); i++) {
+ /* -i turns on and off interlacing. */
+ if (!strcmp(argv[i], "--help")) {
+ /* Every program should use this for help! :) */
+ no = 1;
+ goto usage;
+ } else if (!strcmp(argv[i], "-i")) {
+ if (i == (argc-2)) {
+ fprintf(stderr,
+ "Error: -i specified without y or n.\n");
+ no = 1;
+ goto usage;
+ }
+ if (!strcmp(argv[i+1], "y")) {
+ /* Set interlace. */
+ gdImageInterlace(im, 1);
+ } else if (!strcmp(argv[i+1], "n")) {
+ /* Clear interlace. */
+ gdImageInterlace(im, 0);
+ } else {
+ fprintf(stderr,
+ "Error: -i specified without y or n.\n");
+ no = 1;
+ goto usage;
+ }
+ i++;
+ no = 0;
+ write = 1;
+ } else if (!strcmp(argv[i], "-t")) {
+ /* Set transparent index (or none). */
+ int index;
+ if (i == (argc-2)) {
+ fprintf(stderr,
+ "Error: -t specified without a color table index.\n");
+ no = 1;
+ goto usage;
+ }
+ if (!strcmp(argv[i+1], "none")) {
+ /* -1 means not transparent. */
+ gdImageColorTransparent(im, -1);
+ } else {
+ /* OK, get an integer and set the index. */
+ index = atoi(argv[i+1]);
+ gdImageColorTransparent(im, index);
+ }
+ i++;
+ write = 1;
+ no = 0;
+ } else if (!strcmp(argv[i], "-l")) {
+ /* List the colors in the color table. */
+ int j;
+ /* Tabs used below. */
+ printf("Index Red Green Blue\n");
+ for (j=0; (j < gdImageColorsTotal(im)); j++) {
+ /* Use access macros to learn colors. */
+ printf("%d %d %d %d\n",
+ j,
+ gdImageRed(im, j),
+ gdImageGreen(im, j),
+ gdImageBlue(im, j));
+ }
+ no = 0;
+ } else if (!strcmp(argv[i], "-d")) {
+ /* Output dimensions, etc. */
+ int t;
+ printf("Width: %d Height: %d Colors: %d\n",
+ gdImageSX(im), gdImageSY(im),
+ gdImageColorsTotal(im));
+ t = gdImageGetTransparent(im);
+ if (t != (-1)) {
+ printf("Transparent index: %d\n", t);
+ } else {
+ /* -1 means the image is not transparent. */
+ printf("Transparent index: none\n");
+ }
+ if (gdImageGetInterlaced(im)) {
+ printf("Interlaced: yes\n");
+ } else {
+ printf("Interlaced: no\n");
+ }
+ no = 0;
+ } else {
+ fprintf(stderr, "Unknown argument: %s\n", argv[i]);
+ break;
+ }
+ }
+usage:
+ if (no) {
+ /* If the command failed, output an explanation. */
+ fprintf(stderr,
+"Usage: webpng [-i y|n ] [-l] [-t index|off ] [-d] pngname.png\n"
+
+" -i [y|n] Turns on/off interlace\n"
+" -l Prints the table of color indexes\n"
+" -t [index] Set the transparent color to the specified index (0-255 or none)\n"
+" -d Reports the dimensions and other characteristics of the image.\n"
+"\n"
+"If you specify '-' as the input file, stdin/stdout will be used input/output.\n"
+);
+ }
+ if (write) {
+ if (useStdinStdout) {
+ out = stdout;
+ } else {
+ /* Open a temporary file. */
+
+ /* "temp.tmp" is not good temporary filename. */
+ sprintf(outFn, "webpng.tmp%d", getpid());
+ out = fopen(outFn, "wb");
+
+ if (!out) {
+ fprintf(stderr,
+ "Unable to write to %s -- exiting\n", outFn);
+ exit(1);
+ }
+ }
+
+ /* Write the new png. */
+ gdImagePng(im, out);
+
+ if (!useStdinStdout) {
+ fclose(out);
+ /* Erase the old png. */
+ unlink(argv[argc-1]);
+ /* Rename the new to the old. */
+ if (rename(outFn, argv[argc-1])!=0) {
+ perror("rename");
+ exit(1);
+ }
+ }
+ }
+ /* Delete the image from memory. */
+ if (im) {
+ gdImageDestroy(im);
+ }
+ /* All's well that ends well. */
+ return 0;
+}
+