ACI 转 RGB

来源:互联网 发布:mac 编译php 编辑:程序博客网 时间:2024/04/29 18:25

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

原创粉丝点击