- pngdump tool overlay multiple images (combine spritesheets)
[gba_blender] / tools / pngdump / main.c
index 908818d..d7aba3e 100644 (file)
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <assert.h>
 #include "image.h"
 
 void print_usage(const char *argv0);
@@ -10,8 +11,11 @@ int main(int argc, char **argv)
 {
        int i, mode = 0;
        int text = 0;
-       char *fname = 0, *outfname = 0;
-       struct image img;
+       int renibble = 0;
+       char *outfname = 0;
+       char *infiles[256];
+       int num_infiles = 0;
+       struct image img, tmpimg;
        FILE *out = stdout;
 
        for(i=1; i<argc; i++) {
@@ -34,6 +38,10 @@ int main(int argc, char **argv)
                                        text = 1;
                                        break;
 
+                               case 'n':
+                                       renibble = 1;
+                                       break;
+
                                case 'o':
                                        if(!argv[++i]) {
                                                fprintf(stderr, "%s must be followed by a filename\n", argv[i - 1]);
@@ -57,24 +65,46 @@ int main(int argc, char **argv)
                                return 1;
                        }
                } else {
-                       if(fname) {
-                               fprintf(stderr, "unexpected argument: %s\n", argv[i]);
-                               print_usage(argv[0]);
-                               return 1;
-                       }
-                       fname = argv[i];
+                       infiles[num_infiles++] = argv[i];
                }
        }
 
-       if(!fname) {
+       if(!num_infiles) {
                fprintf(stderr, "pass the filename of a PNG file\n");
                return 1;
        }
-       if(load_image(&img, fname) == -1) {
-               fprintf(stderr, "failed to load PNG file: %s\n", fname);
+       if(load_image(&img, infiles[0]) == -1) {
+               fprintf(stderr, "failed to load PNG file: %s\n", infiles[0]);
                return 1;
        }
 
+       for(i=1; i<num_infiles; i++) {
+               if(load_image(&tmpimg, infiles[i]) == -1) {
+                       fprintf(stderr, "failed to load PNG file: %s\n", infiles[i]);
+                       return 1;
+               }
+               if(tmpimg.width != img.width || tmpimg.height != img.height) {
+                       fprintf(stderr, "size mismatch: first image (%s) is %dx%d, %s is %dx%d\n",
+                                       infiles[0], img.width, img.height, infiles[i], tmpimg.width, tmpimg.height);
+                       return 1;
+               }
+               if(tmpimg.bpp != img.bpp) {
+                       fprintf(stderr, "bpp mismatch: first image (%s) is %d bpp, %s is %d bpp\n",
+                                       infiles[0], img.bpp, infiles[i], img.bpp);
+                       return 1;
+               }
+
+               overlay_key(&tmpimg, 0, &img);
+       }
+
+       if(img.bpp == 4 && renibble) {
+               unsigned char *ptr = img.pixels;
+               for(i=0; i<img.width * img.height; i++) {
+                       unsigned char p = *ptr;
+                       *ptr++ = (p << 4) | (p >> 4);
+               }
+       }
+
        if(outfname) {
                if(!(out = fopen(outfname, "wb"))) {
                        fprintf(stderr, "failed to open output file: %s: %s\n", outfname, strerror(errno));
@@ -84,17 +114,7 @@ int main(int argc, char **argv)
 
        switch(mode) {
        case 0:
-               if(img.bpp > 8 || img.cmap_ncolors == 0 || img.cmap_ncolors > 16) {
-                       fwrite(img.pixels, 1, img.scansz * img.height, out);
-               } else {
-                       /* pack into nibbles */
-                       unsigned char *ptr = img.pixels;
-                       for(i=0; i<img.width * img.height / 2; i++) {
-                               unsigned char pair = (ptr[0] << 4) | ptr[1];
-                               fputc(pair, out);
-                               ptr += 2;
-                       }
-               }
+               fwrite(img.pixels, 1, img.scansz * img.height, out);
                break;
 
        case 1:
@@ -103,7 +123,8 @@ int main(int argc, char **argv)
                                printf("%d %d %d\n", img.cmap[i].r, img.cmap[i].g, img.cmap[i].b);
                        }
                } else {
-                       fwrite(img.cmap, sizeof img.cmap[0], img.cmap_ncolors, out);
+                       /*fwrite(img.cmap, sizeof img.cmap[0], img.cmap_ncolors, out);*/
+                       fwrite(img.cmap, sizeof img.cmap[0], 1 << img.bpp, out);
                }
                break;
 
@@ -127,9 +148,11 @@ void print_usage(const char *argv0)
 {
        printf("Usage: %s [options] <input file>\n", argv0);
        printf("Options:\n");
+       printf(" -o <output file>: specify output file (default: stdout)\n");
        printf(" -p: dump pixels (default)\n");
        printf(" -c: dump colormap (palette) entries\n");
        printf(" -i: print image information\n");
        printf(" -t: dump as text\n");
+       printf(" -n: swap the order of nibbles (for 4bpp)\n");
        printf(" -h: print usage and exit\n");
 }