#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <assert.h>
#include "image.h"
void print_usage(const char *argv0);
{
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++) {
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]);
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));
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:
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;
{
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");
}