rendered paste bodyint ConvertPixelFormat(void* InputAddr,void* OutputAddr, DWORD NbPixels, DDPIXELFORMAT *InputPixelFormat, DDPIXELFORMAT *OutputPixelFormat)
{
if((InputPixelFormat->dwFlags & OutputPixelFormat->dwFlags & DDPF_RGB) == 0) {
ERR("Cannot convert non-RGB pixelformats\n");
return 1; //Fail
} // "if" closed
unsigned int CountBit2;
unsigned int InputMaxValue_Red=0;
unsigned int OutputMaxValue_Red=0;
unsigned int InputMaxValue_Green=0;
unsigned int OutputMaxValue_Green=0;
unsigned int InputMaxValue_Blue=0;
unsigned int OutputMaxValue_Blue=0;
unsigned int InputMaxValue_Alpha=0;
unsigned int OutputMaxValue_Alpha=0;
DWORD CountBit=1;
for(CountBit=0;CountBit<32;CountBit++) {
if((OutputPixelFormat->u2.dwRBitMask) & (1 << CountBit))
OutputMaxValue_Red++;
if((InputPixelFormat->u2.dwRBitMask) & (1 << CountBit))
InputMaxValue_Red++;
if((OutputPixelFormat->u3.dwGBitMask) & (1 << CountBit))
OutputMaxValue_Green++;
if((InputPixelFormat->u3.dwGBitMask) & (1 << CountBit))
InputMaxValue_Green++;
if((OutputPixelFormat->u4.dwBBitMask) & (1 << CountBit))
OutputMaxValue_Blue++;
if((InputPixelFormat->u4.dwBBitMask) & (1 << CountBit))
InputMaxValue_Blue++;
if((OutputPixelFormat->u5.dwRGBAlphaBitMask) & (1 << CountBit))
OutputMaxValue_Alpha++;
if((InputPixelFormat->u5.dwRGBAlphaBitMask) & (1 << CountBit))
InputMaxValue_Alpha++;
}
unsigned int InputBytePerPixel = InputPixelFormat->u1.dwRGBBitCount / 8;
unsigned int OutputBytePerPixel = OutputPixelFormat->u1.dwRGBBitCount / 8;
DWORD Pixel;
DWORD output;
DWORD * OutputPixel;
DWORD * InputPixel;
float RedMultiplier = ((float)(2<<(OutputMaxValue_Red-1))-1)/((float)(2<<(InputMaxValue_Red-1))-1);
float BlueMultiplier = ((float)(2<<(OutputMaxValue_Blue-1))-1)/((float)(2<<(InputMaxValue_Blue-1))-1);
float GreenMultiplier = ((float)(2<<(OutputMaxValue_Green-1))-1)/((float)(2<<(InputMaxValue_Green-1))-1);
float AlphaMultiplier = ((float)(2<<(OutputMaxValue_Alpha-1))-1)/((float)(2<<(InputMaxValue_Alpha-1))-1);
for(Pixel=0;Pixel<NbPixels;Pixel++)
{
OutputPixel = OutputAddr+(Pixel*OutputBytePerPixel);
InputPixel = InputAddr+(Pixel*InputBytePerPixel);
*OutputPixel = 0;
//Red:
if(InputPixelFormat->u2.dwRBitMask != 0 && OutputPixelFormat->u2.dwRBitMask != 0 )
{
output = 0;
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((InputPixelFormat->u2.dwRBitMask) & (1<<CountBit))
output|=(((*InputPixel)>>CountBit) & 1)<<(CountBit2++);
output=(DWORD) (((float)output)*RedMultiplier);
CountBit2 = 0;
for(CountBit=0;CountBit<32;CountBit++)
if((OutputPixelFormat->u2.dwRBitMask) & (1<<CountBit))
*OutputPixel |= ((output >> (CountBit2++)) & 1) << CountBit;
} // "if" closed
//Green:
if(InputPixelFormat->u3.dwGBitMask != 0 && OutputPixelFormat->u3.dwGBitMask != 0 )
{
output = 0;
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((InputPixelFormat->u3.dwGBitMask) & (1<<CountBit))
output|=(((*InputPixel)>>CountBit) & 1)<<(CountBit2++);
output=(DWORD) (((float)output)*GreenMultiplier);
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((OutputPixelFormat->u3.dwGBitMask) & (1<<CountBit))
*OutputPixel |= ((output >> (CountBit2++)) & 1) << CountBit;
} // "if" closed
//Blue:
if(InputPixelFormat->u4.dwBBitMask != 0 && OutputPixelFormat->u4.dwBBitMask != 0 )
{
output = 0;
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((InputPixelFormat->u4.dwBBitMask) & (1<<CountBit))
output|=(((*InputPixel)>>CountBit) & 1)<<(CountBit2++);
output=(DWORD) (((float)output)*BlueMultiplier);
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((OutputPixelFormat->u4.dwBBitMask) & (1<<CountBit))
*OutputPixel |= ((output >> (CountBit2++)) & 1) << CountBit;
} // "if" closed
//Alpha:
if(InputPixelFormat->u5.dwRGBAlphaBitMask != 0 && OutputPixelFormat->u5.dwRGBAlphaBitMask != 0 )
{
output = 0;
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((InputPixelFormat->u5.dwRGBAlphaBitMask) & (1<<CountBit))
output|=(((*InputPixel)>>CountBit) & 1)<<(CountBit2++);
output=(DWORD) (((float)output)*AlphaMultiplier);
for(CountBit=CountBit2=0;CountBit<32;CountBit++)
if((OutputPixelFormat->u5.dwRGBAlphaBitMask) & (1<<CountBit))
*OutputPixel |= ((output >> (CountBit2++)) & 1) << CountBit;
} // "if" closed
} // "for" closed
return 0;
} // function closed