// Creates a palette of 90 colours in the spectrum of the rainbow.
// George W. Taylor - May/2005

DWORD CreatePalette(LPDWORD pPalette)
{
 LPDWORD pMin;
 DWORD i, crefA;
 DWORD countColours;

 ZeroMemory(pPalette, sizeof(DWORD) * 90);

 // Create a palette...
 countColours = 0;
 pMin = pPalette;

 *pMin = (255 << 16);
 ++pMin;
 ++countColours;
 // Red = 255
 i = 1;
 for(;;)
 {
     *pMin = (255 << 16) + (i << 8);
     ++pMin;
     ++countColours;
     i *= 2;
     if(i > 128)break;
 }

 i = 64;
 crefA = 128;
 for(;;)
 {
     crefA += i;
     *pMin = (255 << 16) + (crefA << 8);
     ++pMin;
     ++countColours;
     i /= 2;
     if(i < 1)break;
 }
 // Red = 255, Green = 255
 crefA = 255;
 i = 1;
 for(;;)
 {
     crefA -= i;
     *pMin = (crefA << 16) + (255 << 8);
     ++pMin;
     ++countColours;
     i *= 2;
     if(crefA == 128)break;
 }
 // Red = 128, Green = 255
 crefA = 128;
 i = 64;
 for(;;)
 {
     crefA -= i;
     *pMin = (crefA << 16) + (255 << 8);
     ++pMin;
     ++countColours;
     i /= 2;
     if(!i)break;
 }
 *pMin = (255 << 8);
 ++pMin;
 ++countColours;
 // Red = 0, Green = 255
 i = 1;
 for(;;)
 {
     *pMin = (255 << 8) + i;
     ++pMin;
     ++countColours;
     i *= 2;
     if(i > 128)break;
 }

 i = 64;
 crefA = 128;
 for(;;)
 {
     crefA += i;
     *pMin = (255 << 8) + crefA;
     ++pMin;
     ++countColours;
     i /= 2;
     if(i < 1)break;
 }
 // Green = 255, Blue = 255
 crefA = 255;
 i = 1;
 for(;;)
 {
     crefA -= i;
     *pMin = (crefA << 8) + 255;
     ++pMin;
     ++countColours;
     i *= 2;
     if(crefA == 128)break;
 }
 // Green = 128, Blue = 255
 crefA = 128;
 i = 64;
 for(;;)
 {
     crefA -= i;
     *pMin = (crefA << 8) + 255;
     ++pMin;
     ++countColours;
     i /= 2;
     if(!i)break;
 }
 *pMin = 255;
 ++pMin;
 ++countColours;
 // Green = 0, Blue = 255
 i = 1;
 for(;;)
 {
     *pMin = (i << 16) + 255;
     ++pMin;
     ++countColours;
     i *= 2;
     if(i > 128)break;
 }

 i = 64;
 crefA = 128;
 for(;;)
 {
     crefA += i;
     *pMin = (crefA << 16) + 255;
     ++pMin;
     ++countColours;
     i /= 2;
     if(i < 1)break;
 }

 // Red = 255, Blue = 255
 crefA = 255;
 i = 1;
 for(;;)
 {
     crefA -= i;
     *pMin = (255 << 16) + crefA;
     ++pMin;
     ++countColours;
     i *= 2;
     if(crefA == 128)break;
 }
 // Red = 255, Blue = 128
 crefA = 128;
 i = 64;
 for(;;)
 {
     crefA -= i;
     *pMin = (255 << 16) + crefA;
     ++pMin;
     ++countColours;
     i /= 2;
     if(!i)break;
 }
 // Red = 255, Blue = 1
 //*********************

 // Apply palette indexes
 for(DWORD y = 0; y < countColours; y++)
 {
     pPalette[y] |= (y << 24);
 }

 return countColours;
}
