Blame | Last modification | View Log | RSS feed
{if (!LockSurface())return;int aFPSrcY = theSrcRect.mY * 0x10000;int anAddX = (theSrcRect.mWidth * 0x10000) / theDestRect.mWidth;int anAddY = (theSrcRect.mHeight * 0x10000) / theDestRect.mHeight;if (theColor == Color::White){if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16){ushort* aDestPixelsRow = ((ushort*) mLockedSurfaceDesc.lpSurface) + (theDestRect.mY * mLockedSurfaceDesc.lPitch/2) + theDestRect.mX;ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;ulong aRRoundAdd = aRMask >> 1;ulong aGRoundAdd = aGMask >> 1;ulong aBRoundAdd = aBMask >> 1;for (int y = 0; y < theDestRect.mHeight; y++){int aFPSrcX = theSrcRect.mX * 0x10000;ushort* aDestPixels = aDestPixelsRow;SRC_TYPE* aSrcPixelsRow = aSrcBits + (aSrcMemoryImage->mWidth * (aFPSrcY >> 16));for (int x = 0; x < theDestRect.mWidth; x++, aFPSrcX += anAddX){SRC_TYPE* aSrcPixels = aSrcPixelsRow + (aFPSrcX >> 16);ulong src = READ_COLOR(aSrcPixels);ulong dest = *aDestPixels;int a = src >> 24;if (a != 0){int oma = 256 - a;*(aDestPixels _PLUSPLUS) =src +(((((dest & aRMask) * oma)) >> 8) & aRMask) +(((((dest & aGMask) * oma)) >> 8) & aGMask) +(((((dest & aBMask) * oma)) >> 8) & aBMask);}elseaDestPixels _PLUSPLUS;}aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;aFPSrcY += anAddY;}}else if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 32){ulong* aDestPixelsRow = ((ulong*) mLockedSurfaceDesc.lpSurface) + (theDestRect.mY * mLockedSurfaceDesc.lPitch/4) + theDestRect.mX;ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;ulong aRRoundAdd = aRMask >> 1;ulong aGRoundAdd = aGMask >> 1;ulong aBRoundAdd = aBMask >> 1;for (int y = 0; y < theDestRect.mHeight; y++){int aFPSrcX = theSrcRect.mX * 0x10000;ulong* aDestPixels = aDestPixelsRow;SRC_TYPE* aSrcPixelsRow = aSrcBits + (aSrcMemoryImage->mWidth * (aFPSrcY >> 16));for (int x = 0; x < theDestRect.mWidth; x++, aFPSrcX += anAddX){SRC_TYPE* aSrcPixels = aSrcPixelsRow + (aFPSrcX >> 16);ulong src = READ_COLOR(aSrcPixels);ulong dest = *aDestPixels;int a = src >> 24;if (a != 0){int oma = 256 - a;*(aDestPixels _PLUSPLUS) =src +(((((dest & aRMask) * oma)) >> 8) & aRMask) +(((((dest & aGMask) * oma)) >> 8) & aGMask) +(((((dest & aBMask) * oma)) >> 8) & aBMask);}elseaDestPixels _PLUSPLUS;}aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;aFPSrcY += anAddY;}}}else{int ca = theColor.mAlpha;int cr = (theColor.mRed * ca) / 255;int cg = (theColor.mGreen * ca) / 255;int cb = (theColor.mBlue * ca) / 255;if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16){ushort* aDestPixelsRow = ((ushort*) mLockedSurfaceDesc.lpSurface) + (theDestRect.mY * mLockedSurfaceDesc.lPitch/2) + theDestRect.mX;ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;ulong aRRoundAdd = aRMask >> 1;ulong aGRoundAdd = aGMask >> 1;ulong aBRoundAdd = aBMask >> 1;for (int y = 0; y < theDestRect.mHeight; y++){int aFPSrcX = theSrcRect.mX * 0x10000;ushort* aDestPixels = aDestPixelsRow;SRC_TYPE* aSrcPixelsRow = aSrcBits + (aSrcMemoryImage->mWidth * (aFPSrcY >> 16));for (int x = 0; x < theDestRect.mWidth; x++, aFPSrcX += anAddX){SRC_TYPE* aSrcPixels = aSrcPixelsRow + (aFPSrcX >> 16);ulong src = READ_COLOR(aSrcPixels);ulong dest = *aDestPixels;int a = ((src >> 24) * ca) / 255;if (a != 0){int oma = 256 - a;*(aDestPixels _PLUSPLUS) =(((((dest & aRMask) * oma) + ((src & aRMask) * cr)) >> 8) & aRMask) +(((((dest & aGMask) * oma) + ((src & aGMask) * cg)) >> 8) & aGMask) +(((((dest & aBMask) * oma) + ((src & aBMask) * cb)) >> 8) & aBMask);}elseaDestPixels _PLUSPLUS;}aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;aFPSrcY += anAddY;}}else if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 32){ulong* aDestPixelsRow = ((ulong*) mLockedSurfaceDesc.lpSurface) + (theDestRect.mY * mLockedSurfaceDesc.lPitch/4) + theDestRect.mX;ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;ulong aRRoundAdd = aRMask >> 1;ulong aGRoundAdd = aGMask >> 1;ulong aBRoundAdd = aBMask >> 1;for (int y = 0; y < theDestRect.mHeight; y++){int aFPSrcX = theSrcRect.mX * 0x10000;ulong* aDestPixels = aDestPixelsRow;SRC_TYPE* aSrcPixelsRow = aSrcBits + (aSrcMemoryImage->mWidth * (aFPSrcY >> 16));for (int x = 0; x < theDestRect.mWidth; x++, aFPSrcX += anAddX){SRC_TYPE* aSrcPixels = aSrcPixelsRow + (aFPSrcX >> 16);ulong src = READ_COLOR(aSrcPixels);ulong dest = *aDestPixels;int a = ((src >> 24) * ca) / 255;int oma = 256 - a;if (a != 0){int oma = 256 - a;*(aDestPixels _PLUSPLUS) =(((((dest & aRMask) * oma) + ((src & aRMask) * cr)) >> 8) & aRMask) +(((((dest & aGMask) * oma) + ((src & aGMask) * cg)) >> 8) & aGMask) +(((((dest & aBMask) * oma) + ((src & aBMask) * cb)) >> 8) & aBMask);}elseaDestPixels _PLUSPLUS;}aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;aFPSrcY += anAddY;}}}UnlockSurface();}