unsigned long ulACI2RGB(unsigned int iAci,
unsigned int *piRed,
unsigned int *piGreen,
unsigned int *piBlue)
{
double dTemp;
dTemp = (iAci % 10) / 2;
int iSign = 0;
double dStart, dFactor, dA, dB, dC;
dStart = dFactor = dA = dB = dC = 0.0;
bool bAdd = false;
int iBase = 0;
if ( iAci < 1 )
{
iAci = 1;
}
else if ( iAci < 10 )
{
goto SkipCalc;
}
else if ( iAci < 60 )
{
bAdd = true; iBase = 1;
}
else if ( iAci < 90 )
{
bAdd = false; iBase = 6;
}
else if ( iAci < 140 )
{
bAdd =true; iBase = 9;
}
else if ( iAci < 170 )
{
bAdd = false; iBase = 14;
}
else if ( iAci < 220 )
{
bAdd = true; iBase = 17;
}
else if ( iAci < 250 )
{
bAdd = false; iBase = 22;
}
else if ( iAci < 256 )
{
goto SkipCalc;
}
else
{
iAci = 255;
goto SkipCalc;
}
if ( bAdd )
{
dStart = dTemp == (int)dTemp ? 0 : 0.5;
}
else
{
dStart = dTemp == (int)dTemp ? 0.75 : 0.875;
}
iSign = bAdd ? 1 : -1;
dFactor = dTemp == (int)dTemp ? 0.25 : 0.125;
switch ( (int)dTemp + 1 )
{
case 1:
dA = 1;
break;
case 2:
dA = 0.65;
break;
case 3:
dA = 0.5;
break;
case 4:
dA = 0.3;
break;
default:
dA = 0.15;
break;
}
dB = (dStart + iSign * ((int)(iAci / 10) - iBase) * dFactor ) * dA;
dC = ( (int)(2 * dTemp) % 2) * 0.5 * dA;
SkipCalc:
switch ( iAci )
{
case 1:
*piRed = 255; *piGreen = 0; *piBlue = 0;
break;
case 2:
*piRed = 255; *piGreen = 255; *piBlue = 0;
break;
case 3:
*piRed = 0; *piGreen = 255; *piBlue = 0;
break;
case 4:
*piRed = 0; *piGreen = 255; *piBlue = 255;
break;
case 5:
*piRed = 0; *piGreen = 0; *piBlue = 255;
break;
case 6:
*piRed = 255; *piGreen = 0; *piBlue = 255;
break;
case 7:
case 8:
case 9:
*piRed = 0; *piGreen = 0; *piBlue = 0;
break;
default:
{
if ( iAci < 60 )
{
*piRed = 255 * dA; *piGreen = 255 * dB; *piBlue = 255 * dC;
}
else if ( iAci < 90 )
{
*piRed = 255 * dB; *piGreen = 255 * dA; *piBlue = 255 * dC;
}
else if ( iAci < 140 )
{
*piRed = 255 * dC; *piGreen = 255 * dA; *piBlue = 255 * dB;
}
else if ( iAci < 170 )
{
*piRed = 255 * dC; *piGreen = 255 * dB; *piBlue = 255 * dA;
}
else if ( iAci < 220 )
{
*piRed = 255 * dB; *piGreen = 255 * dC; *piBlue = 255 * dA;
}
else if ( iAci < 250 )
{
*piRed = 255 * dA; *piGreen = 255 * dC; *piBlue = 255 * dB;
}
else if ( iAci < 256 )
{
double dTempValue;
switch ( int(dTemp * 2) + 1 )
{
case 1:
dTempValue = 0.33;
break;
case 2:
dTempValue = 0.464;
case 3:
dTempValue = 0.598;
break;
case 4:
dTempValue = 0.732;
break;
case 5:
dTempValue = 0.866;
break;
default:
dTempValue = 1;
break;
}
*piRed = 255 * dTempValue;
*piGreen = *piBlue = *piRed;
}
}
}
return RGB(*piRed, *piGreen, *piBlue);
}s