/*
    Default QT Palette Generator
    by Mike Melanson (mike at multimedia.cx)
    based on code ripped out of the XAnim media application:
      http://xanim.polter.net/

    This program generates a C header file with the default palette
    colors used in Quicktime multimedia files. To use this program:
      1) Define whether you want the colors printed in RGBA or BGRA order.
         The program will print RGBA order unless you uncomment the line:
         //#define PRINT_BGRA
      2) Compile the program:
         cc qtcolors.c -o qtcolors
      3) Run the program and pipe the output to a .h file:
         qtcolors > qtpalette.h
*/

#include <stdio.h>

//#define PRINT_BGRA

#define xaULONG unsigned long
#define xaLONG long
#define xaUBYTE unsigned char

int qt_2map[] = {
0x93, 0x65, 0x5e,
0xff, 0xff, 0xff,
0xdf, 0xd0, 0xab,
0x00, 0x00, 0x00
};

/* MAX */
int qt_4map[] = {
0xff, 0xfb, 0xff,
0xef, 0xd9, 0xbb,
0xe8, 0xc9, 0xb1,
0x93, 0x65, 0x5e,
0xfc, 0xde, 0xe8,
0x9d, 0x88, 0x91,
0xff, 0xff, 0xff,
0xff, 0xff, 0xff,
0xff, 0xff, 0xff,
0x47, 0x48, 0x37,
0x7a, 0x5e, 0x55,
0xdf, 0xd0, 0xab,
0xff, 0xfb, 0xf9,
0xe8, 0xca, 0xc5,
0x8a, 0x7c, 0x77,
0x00, 0x00, 0x00
};

void QT_Create_Default_Cmap(cnum)
xaULONG cnum;
{
  xaLONG r,g,b,i;

  if (cnum == 4)
  {
    printf ("unsigned char qt_default_palette_4[4 * 4] = {\n");
    for(i=0;i<4;i++)
    { int d = i * 3;
#ifdef PRINT_BGRA
      printf ("  0x%02X, 0x%02X, 0x%02X, 0x00",
        qt_2map[d + 2],
        qt_2map[d + 1],
        qt_2map[d + 0]);
#else
      printf ("  0x%02X, 0x%02X, 0x%02X, 0x00",
        qt_2map[d + 0],
        qt_2map[d + 1],
        qt_2map[d + 2]);
#endif
      printf ("%c\n", (i < 3) ? ',' : ' ');
    }
    printf ("};\n\n");
  }
  else if (cnum == 16)
  {
    printf ("unsigned char qt_default_palette_16[16 * 4] = {\n");
    for(i=0;i<16;i++)
    { int d = i * 3;
#ifdef PRINT_BGRA
      printf ("  0x%02X, 0x%02X, 0x%02X, 0x00",
        qt_4map[d + 2],
        qt_4map[d + 1],
        qt_4map[d + 0]);
#else
      printf ("  0x%02X, 0x%02X, 0x%02X, 0x00",
        qt_4map[d + 0],
        qt_4map[d + 1],
        qt_4map[d + 2]);
#endif
      printf ("%c\n", (i < 15) ? ',' : ' ');
    }
    printf ("};\n\n");
  }
  else
  { static xaUBYTE pat[10] = {0xee,0xdd,0xbb,0xaa,0x88,0x77,0x55,0x44,0x22,0x11};
    r = g = b = 0xff;
    printf ("unsigned char qt_default_palette_256[256 * 4] = {\n");
    for(i=0;i<215;i++)
    {
#ifdef PRINT_BGRA
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        i, i, b, g, r);
#else
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        i, i, r, g, b);
#endif
      b -= 0x33;
      if (b < 0) { b = 0xff; g -= 0x33; if (g < 0) { g = 0xff; r -= 0x33; } }
    }

    for(i=0;i<10;i++)
    {
#ifdef PRINT_BGRA
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        215 + i, 215 + i, 0, 0, pat[i]);
#else
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        215 + i, 215 + i, pat[i], 0, 0);
#endif
    }
    for(i=0;i<10;i++)
    {
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        225 + i, 225 + i, 0, pat[i], 0);
    }
    for(i=0;i<10;i++)
    {
#ifdef PRINT_BGRA
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        235 + i, 235 + i, pat[i], 0, 0);
#else
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        235 + i, 235 + i, 0, 0, pat[i]);
#endif
    }
    for(i=0;i<10;i++)
    {
      printf ("  /* %3d, 0x%02X */  0x%02X, 0x%02X, 0x%02X, 0x00,\n",
        245 + i, 245 + i, pat[i], pat[i], pat[i]);
    }

    printf ("  /* 255, 0xFF */  0x00, 0x00, 0x00, 0x00\n");
    printf ("};\n\n");
  }
}

int main()
{
  printf (
    "//  Default Palettes for Quicktime Files\n" \
    "//  Automatically generated from a utility derived from XAnim:\n" \
    "//    http://xanim.polter.net/\n\n" \
    "#ifndef QTPALETTE_H\n" \
    "#define QTPALETTE_H\n\n");

  QT_Create_Default_Cmap(4);
  QT_Create_Default_Cmap(16);
  QT_Create_Default_Cmap(256);

  printf ("#endif\n");

  return 0;
}
