a12fb3da465b8af8d74b42e693d75bfdeee88d57
[gba_blender] / tools / pngdump / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <assert.h>
6 #include "image.h"
7
8 void print_usage(const char *argv0);
9
10 int main(int argc, char **argv)
11 {
12         int i, mode = 0;
13         int text = 0;
14         int renibble = 0;
15         char *fname = 0, *outfname = 0;
16         struct image img;
17         FILE *out = stdout;
18
19         for(i=1; i<argc; i++) {
20                 if(argv[i][0] == '-') {
21                         if(argv[i][2] == 0) {
22                                 switch(argv[i][1]) {
23                                 case 'p':
24                                         mode = 0;
25                                         break;
26
27                                 case 'c':
28                                         mode = 1;
29                                         break;
30
31                                 case 'i':
32                                         mode = 2;
33                                         break;
34
35                                 case 't':
36                                         text = 1;
37                                         break;
38
39                                 case 'n':
40                                         renibble = 1;
41                                         break;
42
43                                 case 'o':
44                                         if(!argv[++i]) {
45                                                 fprintf(stderr, "%s must be followed by a filename\n", argv[i - 1]);
46                                                 return 1;
47                                         }
48                                         outfname = argv[i];
49                                         break;
50
51                                 case 'h':
52                                         print_usage(argv[0]);
53                                         return 0;
54
55                                 default:
56                                         fprintf(stderr, "invalid option: %s\n", argv[i]);
57                                         print_usage(argv[0]);
58                                         return 1;
59                                 }
60                         } else {
61                                 fprintf(stderr, "invalid option: %s\n", argv[i]);
62                                 print_usage(argv[0]);
63                                 return 1;
64                         }
65                 } else {
66                         if(fname) {
67                                 fprintf(stderr, "unexpected argument: %s\n", argv[i]);
68                                 print_usage(argv[0]);
69                                 return 1;
70                         }
71                         fname = argv[i];
72                 }
73         }
74
75         if(!fname) {
76                 fprintf(stderr, "pass the filename of a PNG file\n");
77                 return 1;
78         }
79         if(load_image(&img, fname) == -1) {
80                 fprintf(stderr, "failed to load PNG file: %s\n", fname);
81                 return 1;
82         }
83
84         if(img.bpp == 4 && renibble) {
85                 unsigned char *ptr = img.pixels;
86                 for(i=0; i<img.width * img.height; i++) {
87                         unsigned char p = *ptr;
88                         *ptr++ = (p << 4) | (p >> 4);
89                 }
90         }
91
92         if(outfname) {
93                 if(!(out = fopen(outfname, "wb"))) {
94                         fprintf(stderr, "failed to open output file: %s: %s\n", outfname, strerror(errno));
95                         return 1;
96                 }
97         }
98
99         switch(mode) {
100         case 0:
101                 fwrite(img.pixels, 1, img.scansz * img.height, out);
102                 break;
103
104         case 1:
105                 if(text) {
106                         for(i=0; i<img.cmap_ncolors; i++) {
107                                 printf("%d %d %d\n", img.cmap[i].r, img.cmap[i].g, img.cmap[i].b);
108                         }
109                 } else {
110                         fwrite(img.cmap, sizeof img.cmap[0], img.cmap_ncolors, out);
111                 }
112                 break;
113
114         case 2:
115                 printf("size: %dx%d\n", img.width, img.height);
116                 printf("bit depth: %d\n", img.bpp);
117                 printf("scanline size: %d bytes\n", img.scansz);
118                 if(img.cmap_ncolors > 0) {
119                         printf("colormap entries: %d\n", img.cmap_ncolors);
120                 } else {
121                         printf("color channels: %d\n", img.nchan);
122                 }
123                 break;
124         }
125
126         fclose(out);
127         return 0;
128 }
129
130 void print_usage(const char *argv0)
131 {
132         printf("Usage: %s [options] <input file>\n", argv0);
133         printf("Options:\n");
134         printf(" -o <output file>: specify output file (default: stdout)\n");
135         printf(" -p: dump pixels (default)\n");
136         printf(" -c: dump colormap (palette) entries\n");
137         printf(" -i: print image information\n");
138         printf(" -t: dump as text\n");
139         printf(" -n: swap the order of nibbles (for 4bpp)\n");
140         printf(" -h: print usage and exit\n");
141 }