nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@4: #include nuclear@0: #include nuclear@0: #include "image.h" nuclear@0: nuclear@0: static int proc_image(const char *fname); nuclear@0: static const char *modestr(int cmode); nuclear@0: static void output_planar(FILE *fp, struct image *img); nuclear@4: static void output_linear(FILE *fp, struct image *img); nuclear@4: static void output_palette(FILE *fp, struct image *img, int pcol_bits); nuclear@0: nuclear@0: static int planar = 0; nuclear@4: static int pcol_bits = 8; nuclear@4: static int verbose = 0; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: int i; nuclear@0: nuclear@0: for(i=1; i ... \n", argv[0]); nuclear@0: printf("Options:\n"); nuclear@4: printf(" -a: amiga mode (4bit palette colors & planar format)\n"); nuclear@4: printf(" -p: output image in planar format\n"); nuclear@4: printf(" -c: output image in linear (chunky) format\n"); nuclear@4: printf(" -v: verbose output\n"); nuclear@0: printf(" -h: print usage and exit\n"); nuclear@0: return 0; nuclear@0: nuclear@0: default: nuclear@0: fprintf(stderr, "invalid option: %s\n", argv[i]); nuclear@0: return 1; nuclear@0: } nuclear@0: } else { nuclear@0: fprintf(stderr, "invalid option: %s\n", argv[i]); nuclear@0: } nuclear@0: } else { nuclear@0: if(proc_image(argv[i]) == -1) { nuclear@0: return 1; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: static int proc_image(const char *fname) nuclear@0: { nuclear@0: int i; nuclear@0: struct image img; nuclear@0: char *outfname, *suffix; nuclear@0: FILE *fp; nuclear@0: nuclear@0: if(load_image(&img, fname) == -1) { nuclear@0: fprintf(stderr, "failed to load image: %s\n", fname); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: if(!(outfname = malloc(strlen(fname) + 4))) { nuclear@0: perror("failed to allocate output filename"); nuclear@0: return -1; nuclear@0: } nuclear@0: strcpy(outfname, fname); nuclear@0: if(!(suffix = strrchr(outfname, '.'))) { nuclear@0: suffix = outfname + strlen(outfname); nuclear@0: } nuclear@4: strcpy(suffix, ".img"); nuclear@0: nuclear@4: if(verbose) { nuclear@4: printf("processing %s -> %s\n", fname, outfname); nuclear@4: } nuclear@0: nuclear@0: if(!(fp = fopen(outfname, "wb"))) { nuclear@0: fprintf(stderr, "failed to open output file: %s: %s\n", outfname, strerror(errno)); nuclear@0: destroy_image(&img); nuclear@0: free(outfname); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@4: if(verbose) { nuclear@6: printf(" size: %dx%d\n", img.width, img.height); nuclear@4: printf(" bits per pixel: %d (%d colors)\n", img.bpp, 1 << img.bpp); nuclear@4: if(img.num_ranges) { nuclear@4: printf(" color ranges:\n"); nuclear@4: for(i=0; ipixels; nuclear@0: nuclear@0: for(i=0; ibpp; i++) { nuclear@0: for(y=0; yheight; y++) { nuclear@0: for(x=0; xwidth; x++) { nuclear@4: acc |= (((*pptr >> i) & 1) << acc_bit); nuclear@0: if(--acc_bit == 0) { nuclear@0: fputc(acc, fp); nuclear@0: acc_bit = 7; nuclear@0: acc = 0; nuclear@4: ++pptr; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@4: static void output_linear(FILE *fp, struct image *img) nuclear@0: { nuclear@0: int i, j; nuclear@0: unsigned char *pptr = img->pixels; nuclear@0: nuclear@0: for(i=0; iheight; i++) { nuclear@0: for(j=0; jwidth; j++) { nuclear@0: fputc(*pptr++, fp); nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@4: static void output_palette(FILE *fp, struct image *img, int pcol_bits) nuclear@4: { nuclear@4: int i, num_colors; nuclear@4: nuclear@4: num_colors = 1 << img->bpp; nuclear@4: nuclear@4: assert(pcol_bits == 8 || pcol_bits == 4); nuclear@4: nuclear@4: if(pcol_bits == 8) { nuclear@4: for(i=0; ipalette[i].r, fp); nuclear@4: fputc(img->palette[i].g, fp); nuclear@4: fputc(img->palette[i].b, fp); nuclear@4: } nuclear@4: } else { nuclear@4: /* nibble colors */ nuclear@4: for(i=0; ipalette[i].b | (img->palette[i].g << 4), fp); nuclear@4: fputc(img->palette[i].r, fp); nuclear@4: } nuclear@4: } nuclear@4: } nuclear@4: nuclear@0: static const char *modestr(int cmode) nuclear@0: { nuclear@0: switch(cmode) { nuclear@0: case CYCLE_NORMAL: nuclear@0: return "forward"; nuclear@0: case CYCLE_REVERSE: nuclear@0: return "reverse"; nuclear@0: case CYCLE_PINGPONG: nuclear@0: return "ping-pong"; nuclear@0: case CYCLE_SINE_HALF: nuclear@0: return "half-sine"; nuclear@0: case CYCLE_SINE: nuclear@0: return "sine"; nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: return "unknown"; nuclear@0: }