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