#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>

#define SCREEN_WIDTH 320L
#define SCREEN_HEIGHT 400L
#define BUFFER_SIZE 8096

UWORD ColourTbl[16] = { 0x000, 0x111, 0x222, 0x333, 0x444, 0x555, 0x666,
                       0x777, 0x888, 0x999, 0xaaa, 0xbbb, 0xccc, 0xddd,
                       0xeee, 0xfff };

#define extract_red(x) ((x & 0xF00) >> 8)
#define extract_green(x) ((x & 0x0F0) >> 4)
#define extract_blue(x) (x & 0x00F)


LONG last_y = -1;

extern int Close_Threshold;

FILE *fp, *palette_file;

main (argc, argv) 
 int argc;
 char **argv;
 {
 unsigned int red, green, blue, i;
 unsigned int width, height, x, y, line_number;
 unsigned char red_buffer[SCREEN_WIDTH], green_buffer[SCREEN_WIDTH],
      blue_buffer[SCREEN_WIDTH];

 if ((argc != 2) && (argc != 3))
   {
   printf ("\nUsage:  ChoosePalette <filename> <palette_file_name>\n");
   exit(0);
   }

 Close_Threshold = 5;

 fp = NULL;
 palette_file = NULL;

 if ((fp = fopen (argv[1], "r")) == NULL)
   {
   printf ("Cannot read input file\n");
   exit(FALSE);
   }

 if ((palette_file = fopen (argv[2], "w")) == NULL)
    {
    printf ("Cannot create palette file\n");
    exit (1);
    }

 width = (unsigned int) (getc(fp) & 0xFF);
 width += ((unsigned int) (getc(fp) & 0xFF) * 256);
 height = (unsigned int) (getc(fp) & 0xFF);
 height += ((unsigned int) (getc(fp) & 0xFF) * 256);

 if ((width > 320) || (height > 400)) {
    printf ("\nError - picture too large\n");
    fclose(fp);
    fclose(palette_file);
    exit (0);
    }

 printf ("Processing...\n");

 start_recording_colours();

 for (y = 0 ; y < height ; y++) {
   /* Skip over the line number.  It's not important at this point */
   getc(fp);
   getc(fp);

   for (x = 0 ; x < width ; x++)
     red_buffer[x] = getc(fp);

   for (x = 0 ; x < width ; x++)
     green_buffer[x] = getc(fp);

   for (x = 0 ; x < width ; x++)
     blue_buffer[x] = getc(fp);

   for (x = 0 ; x < width ; x++)
     {
     red = red_buffer[x];
     green = green_buffer[x];
     blue = blue_buffer[x];
     process (x, height - y, red, green, blue);
     }
   }
 choose_palette();
 for (i = 0 ; i < 16 ; i++) {
    fprintf (palette_file, "%d %d %d\n",
             extract_red(ColourTbl[i]),
             extract_green(ColourTbl[i]),
             extract_blue(ColourTbl[i]));
    }
 fclose(palette_file);
 fclose (fp);
 }


process (x, y, new_red, new_green, new_blue)
  LONG x, y, new_red, new_green, new_blue;
  {
  LONG newline;

  new_red &= 0xFF;
  new_green &= 0xFF;
  new_blue &= 0xFF;

  new_red /= 16;
  new_green /= 16;
  new_blue /= 16;

  newline = 0;
  if (last_y != y) {
    newline = 1;
    last_y = y;
    reset_colours();
    }

  record_colours (new_red, new_green, new_blue);
  }
