/*********************************************************

  QrtPost is a post processor for QRT on the Commodode
  Amiga.  It reads in the QRT file, and spits it out
  as a 4096 color bitmap which can be converted to
  IFF/HAM by another program.

 *********************************************************/

#include <stdio.h>

#define MAXXRES 640      /* max x resolution */
#define HAM_X   320
#define HAM_Y   400
#define SHIFT 3          /* convert 0..127 to 0..15 */

main(argc,argv)
  int argc;
  char *argv[];
{
  int xres, yres, line;
  register int x, value;
  unsigned short r[MAXXRES], g[MAXXRES], b[MAXXRES];
  FILE *in, *out;
  unsigned char fgetc();

  if (argc != 3) {
    printf("Usage: %s InFile OutFile\n",argv[0]);
    exit(1);
  }

  /** open files **/

  if ((in = fopen(argv[1],"r"))==NULL) {
    printf("Couldn't open file %s\n",argv[1]);
    exit(1);
  }

  if ((out = fopen(argv[2],"w"))==NULL) {
    printf("Couldn't open file %s\n",argv[2]);
    exit(1);
  }

  /** load x and y resolution **/

  xres = yres = 0;

  xres  = ((unsigned int)fgetc(in));
  xres += ((unsigned int)(fgetc(in) << 8));

  yres  = ((unsigned int)fgetc(in));
  yres += ((unsigned int)(fgetc(in) << 8));

  if (xres <= 0 || xres > HAM_X || yres <= 0 || yres > HAM_Y) {
    printf("Illegal size for Amiga ham image.\n");
    exit(1);
  }

  /** print info **/

  printf("\nInput  file  = %s\n",   argv[1]);
  printf("Output file  = %s\n\n",   argv[2]);
  printf("X resolution = %d\n",     xres);
  printf("Y resolution = %d\n\n",   yres);

  while (!feof(in)) {
    line  = ((int)fgetc(in));                 /* read scan line number */
    line |= ((int)(fgetc(in) << 8));

    if (feof(in)) {
      fclose(in);
      fclose(out);
      exit(0);
    }

    if (line >= yres) {
      printf("Faulty data file: %d.\n",line);

      fclose(in);                             /* close files */
      fclose(out);

      exit(1);
    }

    for (x=0; x<MAXXRES; x++)                 /* clear buffers */
      r[x] = g[x] = b[x] = 0;

    for (x=0; x<xres; x++)                    /* read color data */
      r[x] = ((short)fgetc(in)) & 0xff;

    for (x=0; x<xres; x++)
      g[x] = ((short)fgetc(in)) & 0xff;

    for (x=0; x<xres; x++)
      b[x] = ((short)fgetc(in)) & 0xff;

    fputc((unsigned char)(line>>8),out);      /* write line number */
    fputc((unsigned char)(line&0xff),out);

    for (x=0; x<(HAM_X/4); x++) {             /* write color data */
       value  = (r[4*x+3] >> SHIFT);
       value  = value << 4;
       value += (r[4*x+2] >> SHIFT);
       fputc((unsigned char)(value),out);

       value  = (r[4*x+1] >> SHIFT);
       value  = value << 4;
       value += (r[4*x+0] >> SHIFT);

       fputc((unsigned char)(value),out);
    }

    for (x=0; x<(HAM_X/4); x++) {              /* write color data */
       value  = (g[4*x+3] >> SHIFT);
       value  = value << 4;
       value += (g[4*x+2] >> SHIFT);
       fputc((unsigned char)(value),out);

       value  = (g[4*x+1] >> SHIFT);
       value  = value << 4;
       value += (g[4*x+0] >> SHIFT);

       fputc((unsigned char)(value),out);
    }

    for (x=0; x<(HAM_X/4); x++) {              /* write color data */
       value  = (b[4*x+3] >> SHIFT);
       value  = value << 4;
       value += (b[4*x+2] >> SHIFT);
       fputc((unsigned char)(value),out);

       value  = (b[4*x+1] >> SHIFT);
       value  = value << 4;
       value += (b[4*x+0] >> SHIFT);

       fputc((unsigned char)(value),out);
    }

  }

  fclose(in);                                 /* close files */
  fclose(out);

}

