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;