All pastes #925467 Raw Edit

Untitled

public text v1 · immutable
·published 2008-03-03 01:06 UTC
rendered paste body
	TUint8 * NewColorData = new TUint8[TextureSize*3];
	TUint8 * NewAlphaData = new TUint8[TextureSize];

	if (iCurrentRequest->iRealWidth != iCurrentRequest->iInternalWidth && iCurrentRequest->iRealHeight != iCurrentRequest->iInternalHeight)
	{
		double nXFactor = (double)iCurrentRequest->iRealWidth/(double)iCurrentRequest->iInternalWidth;
		double nYFactor = (double)iCurrentRequest->iRealHeight/(double)iCurrentRequest->iInternalHeight;
		double fraction_x, fraction_y, one_minus_x, one_minus_y;
		int ceil_x, ceil_y, floor_x, floor_y;
		TUint8 c1[4];
		TUint8 c2[4];
		TUint8 c3[4];
		TUint8 c4[4];
		TUint8 final[3];
		TUint8 red, green, blue,alpha;

		TUint8 b1, b2;

	    for (int x = 0; x < iCurrentRequest->iInternalWidth; ++x)
        for (int y = 0; y < iCurrentRequest->iInternalHeight; ++y)
        {
            // Setup

            floor_x = (int)floor(x * nXFactor);
            floor_y = (int)floor(y * nYFactor);
            ceil_x = floor_x + 1;
            if (ceil_x >= iCurrentRequest->iRealWidth) ceil_x = floor_x;
            ceil_y = floor_y + 1;
            if (ceil_y >= iCurrentRequest->iRealHeight) ceil_y = floor_y;
            fraction_x = x * nXFactor - floor_x;
            fraction_y = y * nYFactor - floor_y;
            one_minus_x = 1.0 - fraction_x;
            one_minus_y = 1.0 - fraction_y;

			memcpy(c1,&TextureData[floor_y*iCurrentRequest->iRealWidth*3+floor_x*3],3);
			memcpy(c2,&TextureData[floor_y*iCurrentRequest->iRealWidth*3+ceil_x*3],3);
			memcpy(c3,&TextureData[ceil_y*iCurrentRequest->iRealWidth*3+floor_x*3],3);
			memcpy(c4,&TextureData[ceil_y*iCurrentRequest->iRealWidth*3+ceil_x*3],3);

			memcpy(&c1[3],&AlphaData[floor_y*iCurrentRequest->iRealWidth+floor_x],1);
			memcpy(&c2[3],&AlphaData[floor_y*iCurrentRequest->iRealWidth+ceil_x],1);
			memcpy(&c3[3],&AlphaData[ceil_y*iCurrentRequest->iRealWidth+floor_x],1);
			memcpy(&c4[3],&AlphaData[ceil_y*iCurrentRequest->iRealWidth+ceil_x],1);

            // Blue

            b1 = (TUint8)(one_minus_x * c1[0] + fraction_x * c2[0]);
            b2 = (TUint8)(one_minus_x * c3[0] + fraction_x * c4[0]);            
            blue = (TUint8)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            // Green

            b1 = (TUint8)(one_minus_x * c1[1] + fraction_x * c2[1]);
            b2 = (TUint8)(one_minus_x * c3[1] + fraction_x * c4[1]);            
            green = (TUint8)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            // Red

            b1 = (TUint8)(one_minus_x * c1[2] + fraction_x * c2[2]);
            b2 = (TUint8)(one_minus_x * c3[2] + fraction_x * c4[2]);            
            red = (TUint8)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

            // Alpha

            b1 = (TUint8)(one_minus_x * c1[3] + fraction_x * c2[3]);
            b2 = (TUint8)(one_minus_x * c3[3] + fraction_x * c4[3]);            
            alpha = (TUint8)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

			final[0] = blue;
			final[1] = green;
			final[2] = red;

			memcpy(&NewColorData[y*iCurrentRequest->iInternalWidth*3+x*3],final,3);
			memcpy(&NewAlphaData[y*iCurrentRequest->iInternalWidth+x],&alpha,1);
        }

	}

	// Ask the bitmap heap to be unlocked if this is a large bitmap
	iBitmap->UnlockHeap( EFalse );

	TextureData = NewColorData;
	AlphaData = NewAlphaData;