summaryrefslogtreecommitdiff
path: root/osframework/source/SexyAppFramework/DDI_BltRotated.inc
diff options
context:
space:
mode:
Diffstat (limited to 'osframework/source/SexyAppFramework/DDI_BltRotated.inc')
-rw-r--r--osframework/source/SexyAppFramework/DDI_BltRotated.inc217
1 files changed, 217 insertions, 0 deletions
diff --git a/osframework/source/SexyAppFramework/DDI_BltRotated.inc b/osframework/source/SexyAppFramework/DDI_BltRotated.inc
new file mode 100644
index 0000000..b8e1cb9
--- /dev/null
+++ b/osframework/source/SexyAppFramework/DDI_BltRotated.inc
@@ -0,0 +1,217 @@
+{
+ double aCos = cos(theRot);
+ double aSin = sin(theRot);
+
+ int aCosLong = (int) (aCos * 0x10000);
+ int aSinLong = (int) (aSin * 0x10000);
+
+ if (!LockSurface())
+ return;
+
+ int aRedShift = mDDInterface->mRedShift;
+ int aGreenShift = mDDInterface->mGreenShift;
+ int aBlueShift = mDDInterface->mBlueShift;
+
+ int aRedRightShift = 32 - mDDInterface->mRedBits;
+ int aGreenRightShift = 24 - mDDInterface->mGreenBits;
+ int aBlueRightShift = 16 - mDDInterface->mBlueBits;
+
+ int aNumBits = mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount;
+
+ 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;
+
+ if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16)
+ {
+ ushort* aDestPixelsRow = ((ushort*) mLockedSurfaceDesc.lpSurface) + ((int)aDestRect.mY * mLockedSurfaceDesc.lPitch/2) + (int)aDestRect.mX;
+ int aDestPixelsPitch = mLockedSurfaceDesc.lPitch/2;
+
+ if (theColor == Color::White)
+ {
+ #define DEST_PIXEL_TYPE ushort
+ #define WRITE_PIXEL\
+ {\
+ ushort dest = *aDestPixels;\
+ int oma = 256 - (a1 + a2 + a3 + a4);\
+ *(aDestPixels++) = \
+ (((((dest & aBMask) * oma) >> 8) & aBMask) + \
+ (((((src1 & 0x0000FF) * a1) + \
+ ((src2 & 0x0000FF) * a2) + \
+ ((src3 & 0x0000FF) * a3) + \
+ ((src4 & 0x0000FF) * a4)) >> aBlueRightShift) << aBlueShift)) | \
+ (((((dest & aGMask) * oma) >> 8) & aGMask) + \
+ (((((src1 & 0x00FF00) * a1) + \
+ ((src2 & 0x00FF00) * a2) + \
+ ((src3 & 0x00FF00) * a3) + \
+ ((src4 & 0x00FF00) * a4)) >> aGreenRightShift) << aGreenShift)) | \
+ (((((dest & aRMask) * oma) >> 8) & aRMask) + \
+ (((((src1 & 0xFF0000) * a1) + \
+ ((src2 & 0xFF0000) * a2) + \
+ ((src3 & 0xFF0000) * a3) + \
+ ((src4 & 0xFF0000) * a4)) >> aRedRightShift) << aRedShift)); \
+ }
+ #define WRITE_PIXEL_OPTIMIZED_565\
+ {\
+ ulong dest = (*aDestPixels | (*aDestPixels << 16)) & 0x7E0F81F;\
+ int oma = (256 - (a1 + a2 + a3 + a4)) >> 3;\
+ ulong src_b = ((src1 & 0xFF00FF) * a1 + (src2 & 0xFF00FF) * a2 + (src3 & 0xFF00FF) * a3 + (src4 & 0xFF00FF) * a4) & 0xFF00FF00;\
+ src_b = ((((src1 & 0xFF00) * a1 + (src2 & 0xFF00) * a2 + (src3 & 0xFF00) * a3 + (src4 & 0xFF00) * a4) & 0xFF0000) | src_b) >> 8;\
+ ulong s = ((src_b & 0xfc00) << 11) + (src_b >> 8 & 0xf800) + (src_b >> 3 & 0x1f);\
+ dest = ((dest * oma >> 5) & 0x7E0F81F) + s;\
+ *(aDestPixels++) = dest | (dest >> 16);\
+ }
+ #define WRITE_PIXEL_OPTIMIZED_555\
+ {\
+ ulong dest = (*aDestPixels | (*aDestPixels << 16)) & 0x3E07C1F;\
+ int oma = (256 - (a1 + a2 + a3 + a4)) >> 3;\
+ ulong src_b = ((src1 & 0xFF00FF) * a1 + (src2 & 0xFF00FF) * a2 + (src3 & 0xFF00FF) * a3 + (src4 & 0xFF00FF) * a4) & 0xFF00FF00;\
+ src_b = ((((src1 & 0xFF00) * a1 + (src2 & 0xFF00) * a2 + (src3 & 0xFF00) * a3 + (src4 & 0xFF00) * a4) & 0xFF0000) | src_b) >> 8;\
+ ulong s = ((src_b & 0xf800) << 10) + (src_b >> 9 & 0x7c00) + (src_b >> 3 & 0x1f);\
+ dest = ((dest * oma >> 5) & 0x3E07C1F) + s;\
+ *(aDestPixels++) = dest | (dest >> 16);\
+ }
+ #define WRITE_PIXEL_OPTIMIZED
+
+ #include "BltRotatedHelper.inc"
+
+ #undef WRITE_PIXEL
+ #undef DEST_PIXEL_TYPE
+ #undef WRITE_PIXEL_OPTIMIZED
+ #undef WRITE_PIXEL_OPTIMIZED_555
+ #undef WRITE_PIXEL_OPTIMIZED_565
+ }
+ else
+ {
+ // Colorized version
+
+ int ca = theColor.mAlpha;
+ int cr = theColor.mRed + 1;
+ int cg = theColor.mGreen + 1;
+ int cb = theColor.mBlue + 1;
+
+ #define DEST_PIXEL_TYPE ushort
+ #define WRITE_PIXEL\
+ {\
+ ushort dest = *aDestPixels;\
+ a1 = (a1*ca)>>8; a2 = (a2*ca)>>8; a3 = (a3*ca)>>8; a4 = (a4*ca)>>8; \
+ int oma = 256 - (a1 + a2 + a3 + a4); \
+ *(aDestPixels++) = \
+ ( ((((dest & aBMask) * oma) >> 8) & aBMask) + \
+ (((( (((src1 & 0x0000FF) * a1) + \
+ ((src2 & 0x0000FF) * a2) + \
+ ((src3 & 0x0000FF) * a3) + \
+ ((src4 & 0x0000FF) * a4)) >> 8) * cb) >> aBlueRightShift) << aBlueShift) ) | \
+ ( ((((dest & aGMask) * oma) >> 8) & aGMask) + \
+ (((( (((src1 & 0x00FF00) * a1) + \
+ ((src2 & 0x00FF00) * a2) + \
+ ((src3 & 0x00FF00) * a3) + \
+ ((src4 & 0x00FF00) * a4)) >> 8) * cg) >> aGreenRightShift) << aGreenShift) ) | \
+ ( ((((dest & aRMask) * oma) >> 8) & aRMask) + \
+ (((( (((src1 & 0xFF0000) * a1) + \
+ ((src2 & 0xFF0000) * a2) + \
+ ((src3 & 0xFF0000) * a3) + \
+ ((src4 & 0xFF0000) * a4)) >> 8) * cr) >> aRedRightShift) << aRedShift) ); \
+ }
+
+ #include "BltRotatedHelper.inc"
+
+ #undef WRITE_PIXEL
+ #undef DEST_PIXEL_TYPE
+ }
+ }
+ else if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 32)
+ {
+ ulong* aDestPixelsRow = ((ulong*) mLockedSurfaceDesc.lpSurface) + ((int)aDestRect.mY * mLockedSurfaceDesc.lPitch/4) + (int)aDestRect.mX;
+ int aDestPixelsPitch = mLockedSurfaceDesc.lPitch/4;
+
+ if (theColor == Color::White)
+ {
+ #define DEST_PIXEL_TYPE ulong
+ #define WRITE_PIXEL\
+ {\
+ ulong dest = *aDestPixels;\
+ int oma = 256 - (a1 + a2 + a3 + a4);\
+ *(aDestPixels++) = \
+ (((((dest & aBMask) * oma) >> 8) & aBMask) + \
+ (((((src1 & 0x0000FF) * a1) + \
+ ((src2 & 0x0000FF) * a2) + \
+ ((src3 & 0x0000FF) * a3) + \
+ ((src4 & 0x0000FF) * a4)) >> aBlueRightShift) << aBlueShift)) | \
+ (((((dest & aGMask) * oma) >> 8) & aGMask) + \
+ (((((src1 & 0x00FF00) * a1) + \
+ ((src2 & 0x00FF00) * a2) + \
+ ((src3 & 0x00FF00) * a3) + \
+ ((src4 & 0x00FF00) * a4)) >> aGreenRightShift) << aGreenShift)) | \
+ (((((dest & aRMask) * oma) >> 8) & aRMask) + \
+ (((((src1 & 0xFF0000) * a1) + \
+ ((src2 & 0xFF0000) * a2) + \
+ ((src3 & 0xFF0000) * a3) + \
+ ((src4 & 0xFF0000) * a4)) >> aRedRightShift) << aRedShift));\
+ }
+ #define WRITE_PIXEL_OPTIMIZED\
+ {\
+ ulong dest = *aDestPixels;\
+ int oma = 256 - (a1 + a2 + a3 + a4);\
+ ulong src_b = ((src1 & 0xFF00FF) * a1 + (src2 & 0xFF00FF) * a2 + (src3 & 0xFF00FF) * a3 + (src4 & 0xFF00FF) * a4) & 0xFF00FF00;\
+ ulong src_b2 = ((src1 & 0xFF00) * a1 + (src2 & 0xFF00) * a2 + (src3 & 0xFF00) * a3 + (src4 & 0xFF00) * a4) & 0xFF0000;\
+ *(aDestPixels++) =\
+ ((((dest & 0xFF00FF) * oma + src_b) >> 8) & 0xFF00FF) |\
+ ((((dest & 0x00FF00) * oma + src_b2) >> 8) & 0x00FF00);\
+ }
+
+
+
+ #include "BltRotatedHelper.inc"
+
+ #undef WRITE_PIXEL
+ #undef WRITE_PIXEL_OPTIMIZED
+ #undef DEST_PIXEL_TYPE
+ }
+ else
+ {
+ // Colorized version
+
+ int ca = theColor.mAlpha;
+ int cr = theColor.mRed + 1;
+ int cg = theColor.mGreen + 1;
+ int cb = theColor.mBlue + 1;
+
+ #define DEST_PIXEL_TYPE ulong
+ #define WRITE_PIXEL\
+ {\
+ ulong dest = *aDestPixels;\
+ a1 = (a1*ca)>>8; a2 = (a2*ca)>>8; a3 = (a3*ca)>>8; a4 = (a4*ca)>>8; \
+ int oma = 256 - (a1 + a2 + a3 + a4);\
+ *(aDestPixels++) = \
+ ( ((((dest & aBMask) * oma) >> 8) & aBMask) + \
+ (((( (((src1 & 0x0000FF) * a1) + \
+ ((src2 & 0x0000FF) * a2) + \
+ ((src3 & 0x0000FF) * a3) + \
+ ((src4 & 0x0000FF) * a4)) >> 8) * cb) >> aBlueRightShift) << aBlueShift) ) | \
+ ( ((((dest & aGMask) * oma) >> 8) & aGMask) + \
+ (((( (((src1 & 0x00FF00) * a1) + \
+ ((src2 & 0x00FF00) * a2) + \
+ ((src3 & 0x00FF00) * a3) + \
+ ((src4 & 0x00FF00) * a4)) >> 8) * cg) >> aGreenRightShift) << aGreenShift) ) | \
+ ( ((((dest & aRMask) * oma) >> 8) & aRMask) + \
+ (((( (((src1 & 0xFF0000) * a1) + \
+ ((src2 & 0xFF0000) * a2) + \
+ ((src3 & 0xFF0000) * a3) + \
+ ((src4 & 0xFF0000) * a4)) >> 8) * cr) >> aRedRightShift) << aRedShift) );\
+ }
+
+ #include "BltRotatedHelper.inc"
+
+ #undef WRITE_PIXEL
+ #undef DEST_PIXEL_TYPE
+
+ }
+ }
+
+ UnlockSurface();
+} \ No newline at end of file