All pastes #264387 Raw Edit

Sans nom

public text v1 · immutable
·published 2006-12-02 10:38 UTC
rendered paste body
int 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