Implement (Int)EngAlphaBlend and 8, 16, 24 and 32 bpp DIB AlphaBlend functions. AlphaBlend() should work now. Modified: trunk/reactos/subsys/win32k/dib/dib.c Modified: trunk/reactos/subsys/win32k/dib/dib.h Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c Modified: trunk/reactos/subsys/win32k/dib/dib1bpp.c Modified: trunk/reactos/subsys/win32k/dib/dib24bpp.c Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c Modified: trunk/reactos/subsys/win32k/dib/dib4bpp.c Modified: trunk/reactos/subsys/win32k/dib/dib8bpp.c Modified: trunk/reactos/subsys/win32k/eng/bitblt.c Modified: trunk/reactos/subsys/win32k/eng/xlate.c Modified: trunk/reactos/subsys/win32k/include/inteng.h Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c Modified: trunk/reactos/subsys/win32k/stubs/xpstubs.c _____
Modified: trunk/reactos/subsys/win32k/dib/dib.c --- trunk/reactos/subsys/win32k/dib/dib.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -33,63 +33,68 @@
/* 0 */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, + Dummy_ColorFill, Dummy_AlphaBlend }, /* BMF_1BPP */ { DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine, DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_1BPP_StretchBlt, - DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill + DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill, DIB_1BPP_AlphaBlend }, /* BMF_4BPP */ { DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine, DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_4BPP_StretchBlt, - DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill + DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill, DIB_4BPP_AlphaBlend }, /* BMF_8BPP */ { DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine, DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_8BPP_StretchBlt, - DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill + DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill, DIB_8BPP_AlphaBlend }, /* BMF_16BPP */ { DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine, DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_16BPP_StretchBlt, - DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill + DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_16BPP_AlphaBlend }, /* BMF_24BPP */ { DIB_24BPP_PutPixel, DIB_24BPP_GetPixel, DIB_24BPP_HLine, DIB_24BPP_VLine, DIB_24BPP_BitBlt, DIB_24BPP_BitBltSrcCopy, DIB_24BPP_StretchBlt, - DIB_24BPP_TransparentBlt, DIB_24BPP_ColorFill + DIB_24BPP_TransparentBlt, DIB_24BPP_ColorFill, DIB_24BPP_AlphaBlend }, /* BMF_32BPP */ { DIB_32BPP_PutPixel, DIB_32BPP_GetPixel, DIB_32BPP_HLine, DIB_32BPP_VLine, DIB_32BPP_BitBlt, DIB_32BPP_BitBltSrcCopy, DIB_32BPP_StretchBlt, - DIB_32BPP_TransparentBlt, DIB_32BPP_ColorFill + DIB_32BPP_TransparentBlt, DIB_32BPP_ColorFill, DIB_32BPP_AlphaBlend }, /* BMF_4RLE */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, + Dummy_ColorFill, Dummy_AlphaBlend }, /* BMF_8RLE */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, + Dummy_ColorFill, Dummy_AlphaBlend }, /* BMF_JPEG */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, + Dummy_ColorFill, Dummy_AlphaBlend }, /* BMF_PNG */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, + Dummy_ColorFill, Dummy_AlphaBlend } };
@@ -240,4 +245,12 @@ }
+BOOLEAN +Dummy_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + return FALSE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib.h --- trunk/reactos/subsys/win32k/dib/dib.h 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib.h 2005-11-04 23:37:06 UTC (rev 19008) @@ -44,6 +44,7 @@
typedef BOOLEAN (*PFN_DIB_StretchBlt)(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLI POBJ*,XLATEOBJ*,ULONG); typedef BOOLEAN (*PFN_DIB_TransparentBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULO NG); typedef BOOLEAN (*PFN_DIB_ColorFill)(SURFOBJ*, RECTL*, ULONG); +typedef BOOLEAN (*PFN_DIB_AlphaBlend)(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
typedef struct { @@ -56,6 +57,7 @@ PFN_DIB_StretchBlt DIB_StretchBlt; PFN_DIB_TransparentBlt DIB_TransparentBlt; PFN_DIB_ColorFill DIB_ColorFill; + PFN_DIB_AlphaBlend DIB_AlphaBlend; } DIB_FUNCTIONS;
extern DIB_FUNCTIONS DibFunctionsForBitmapFormat[]; @@ -68,6 +70,7 @@ BOOLEAN Dummy_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ* ,XLATEOBJ*,ULONG); BOOLEAN Dummy_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); BOOLEAN Dummy_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN Dummy_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_1BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_1BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -78,6 +81,7 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPO BJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG ); BOOLEAN DIB_1BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_1BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_4BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -88,6 +92,7 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPO BJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG ); BOOLEAN DIB_4BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_4BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_8BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -98,6 +103,7 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPO BJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG ); BOOLEAN DIB_8BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_8BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_16BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -108,6 +114,7 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIP OBJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULON G); BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_16BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -118,6 +125,7 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIP OBJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULON G); BOOLEAN DIB_24BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_24BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
VOID DIB_32BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); ULONG DIB_32BPP_GetPixel(SURFOBJ*,LONG,LONG); @@ -128,6 +136,7 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIP OBJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULON G); BOOLEAN DIB_32BPP_ColorFill(SURFOBJ*, RECTL*, ULONG); +BOOLEAN DIB_32BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; _____
Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c --- trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1358,4 +1358,123 @@
return TRUE; }
+typedef union { + ULONG ul; + struct { + UCHAR red; + UCHAR green; + UCHAR blue; + UCHAR alpha; + } col; +} NICEPIXEL32; + +typedef union { + USHORT us; + struct { + USHORT red:5, + green:6, + blue:5; + } col; +} NICEPIXEL16; + +STATIC inline UCHAR +Clamp5(ULONG val) +{ + return (val > 31) ? 31 : val; +} + +STATIC inline UCHAR +Clamp6(ULONG val) +{ + return (val > 63) ? 63 : val; +} + +BOOLEAN +DIB_16BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + INT Rows, Cols, SrcX, SrcY; + register PUSHORT Dst; + ULONG DstDelta; + BLENDFUNCTION BlendFunc; + register NICEPIXEL16 DstPixel; + register NICEPIXEL32 SrcPixel; + UCHAR Alpha, SrcBpp; + + DPRINT("DIB_16BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + + ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top && + DestRect->right - DestRect->left == SourceRect->right - SourceRect->left); + + BlendFunc = BlendObj->BlendFunction; + if (BlendFunc.BlendOp != AC_SRC_OVER) + { + DPRINT1("BlendOp != AC_SRC_OVER\n"); + return FALSE; + } + if (BlendFunc.BlendFlags != 0) + { + DPRINT1("BlendFlags != 0\n"); + return FALSE; + } + if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0) + { + DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat); + return FALSE; + } + if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 && + BitsPerFormat(Source->iBitmapFormat) != 32) + { + DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n"); + return FALSE; + } + + Dst = (PUSHORT)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) + + (DestRect->left << 1)); + DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 1); + SrcBpp = BitsPerFormat(Source->iBitmapFormat); + + Rows = DestRect->bottom - DestRect->top; + SrcY = SourceRect->top; + while (--Rows >= 0) + { + Cols = DestRect->right - DestRect->left; + SrcX = SourceRect->left; + while (--Cols >= 0) + { + if (SrcBpp <= 16) + { + DstPixel.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); + SrcPixel.col.red = (DstPixel.col.red << 3) | (DstPixel.col.red >> 2); + SrcPixel.col.green = (DstPixel.col.green << 2) | (DstPixel.col.green >> 4); + SrcPixel.col.blue = (DstPixel.col.blue << 3) | (DstPixel.col.blue >> 2); + } + else + { + SrcPixel.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY); + } + SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha; + + Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? + SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; + + DstPixel.us = *Dst; + DstPixel.col.red = Clamp5(DstPixel.col.red * (255 - Alpha) / 255 + (SrcPixel.col.red >> 3)); + DstPixel.col.green = Clamp6(DstPixel.col.green * (255 - Alpha) / 255 + (SrcPixel.col.green >> 2)); + DstPixel.col.blue = Clamp5(DstPixel.col.blue * (255 - Alpha) / 255 + (SrcPixel.col.blue >> 3)); + *Dst++ = DstPixel.us; + } + Dst = (PUSHORT)((ULONG_PTR)Dst + DstDelta); + SrcY++; + } + + return TRUE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib1bpp.c --- trunk/reactos/subsys/win32k/dib/dib1bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib1bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1303,4 +1303,13 @@
return FALSE; }
+BOOLEAN +DIB_1BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + UNIMPLEMENTED; + return FALSE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib24bpp.c --- trunk/reactos/subsys/win32k/dib/dib24bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib24bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1331,4 +1331,98 @@
return TRUE; }
+typedef union { + ULONG ul; + struct { + UCHAR red; + UCHAR green; + UCHAR blue; + UCHAR alpha; + } col; +} NICEPIXEL32; + +STATIC inline UCHAR +Clamp8(ULONG val) +{ + return (val > 255) ? 255 : val; +} + +BOOLEAN +DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + INT Rows, Cols, SrcX, SrcY; + register PUCHAR Dst; + ULONG DstDelta; + BLENDFUNCTION BlendFunc; + register NICEPIXEL32 DstPixel, SrcPixel; + UCHAR Alpha, SrcBpp; + + DPRINT("DIB_24BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + + ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top && + DestRect->right - DestRect->left == SourceRect->right - SourceRect->left); + + BlendFunc = BlendObj->BlendFunction; + if (BlendFunc.BlendOp != AC_SRC_OVER) + { + DPRINT1("BlendOp != AC_SRC_OVER\n"); + return FALSE; + } + if (BlendFunc.BlendFlags != 0) + { + DPRINT1("BlendFlags != 0\n"); + return FALSE; + } + if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0) + { + DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat); + return FALSE; + } + if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 && + BitsPerFormat(Source->iBitmapFormat) != 32) + { + DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n"); + return FALSE; + } + + Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) + + (DestRect->left * 3)); + DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) * 3); + SrcBpp = BitsPerFormat(Source->iBitmapFormat); + + Rows = DestRect->bottom - DestRect->top; + SrcY = SourceRect->top; + while (--Rows >= 0) + { + Cols = DestRect->right - DestRect->left; + SrcX = SourceRect->left; + while (--Cols >= 0) + { + SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); + SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha; + + Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? + SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; + + DstPixel.ul = *Dst; + DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red); + DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green); + DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue); + *Dst = DstPixel.ul; + Dst = (PUCHAR)((ULONG_PTR)Dst + 3); + } + Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta); + SrcY++; + } + + return TRUE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c --- trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1256,4 +1256,98 @@
return TRUE; }
+typedef union { + ULONG ul; + struct { + UCHAR red; + UCHAR green; + UCHAR blue; + UCHAR alpha; + } col; +} NICEPIXEL32; + +STATIC inline UCHAR +Clamp8(ULONG val) +{ + return (val > 255) ? 255 : val; +} + +BOOLEAN +DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + INT Rows, Cols, SrcX, SrcY; + register PULONG Dst; + ULONG DstDelta; + BLENDFUNCTION BlendFunc; + register NICEPIXEL32 DstPixel, SrcPixel; + UCHAR Alpha, SrcBpp; + + DPRINT("DIB_32BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + + ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top && + DestRect->right - DestRect->left == SourceRect->right - SourceRect->left); + + BlendFunc = BlendObj->BlendFunction; + if (BlendFunc.BlendOp != AC_SRC_OVER) + { + DPRINT1("BlendOp != AC_SRC_OVER\n"); + return FALSE; + } + if (BlendFunc.BlendFlags != 0) + { + DPRINT1("BlendFlags != 0\n"); + return FALSE; + } + if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0) + { + DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat); + return FALSE; + } + if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 && + BitsPerFormat(Source->iBitmapFormat) != 32) + { + DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n"); + return FALSE; + } + + Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) + + (DestRect->left << 2)); + DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 2); + SrcBpp = BitsPerFormat(Source->iBitmapFormat); + + Rows = DestRect->bottom - DestRect->top; + SrcY = SourceRect->top; + while (--Rows >= 0) + { + Cols = DestRect->right - DestRect->left; + SrcX = SourceRect->left; + while (--Cols >= 0) + { + SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); + SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha; + + Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? + SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; + + DstPixel.ul = *Dst; + DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red); + DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green); + DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue); + DstPixel.col.alpha = Clamp8(DstPixel.col.alpha * (255 - Alpha) / 255 + SrcPixel.col.alpha); + *Dst++ = DstPixel.ul; + } + Dst = (PULONG)((ULONG_PTR)Dst + DstDelta); + SrcY++; + } + + return TRUE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib4bpp.c --- trunk/reactos/subsys/win32k/dib/dib4bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib4bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1189,4 +1189,13 @@
return FALSE; }
+BOOLEAN +DIB_4BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + UNIMPLEMENTED; + return FALSE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/dib/dib8bpp.c --- trunk/reactos/subsys/win32k/dib/dib8bpp.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/dib/dib8bpp.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -1217,4 +1217,162 @@
return TRUE; }
+typedef union { + ULONG ul; + struct { + UCHAR red; + UCHAR green; + UCHAR blue; + UCHAR alpha; + } col; +} NICEPIXEL32; + +typedef union { + USHORT us; + struct { + USHORT red:5, + green:6, + blue:5; + } col; +} NICEPIXEL16; + +STATIC inline UCHAR +Clamp8(ULONG val) +{ + return (val > 255) ? 255 : val; +} + +BOOLEAN +DIB_8BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect, + RECTL* SourceRect, CLIPOBJ* ClipRegion, + XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) +{ + INT Rows, Cols, SrcX, SrcY; + register PUCHAR Dst; + ULONG DstDelta; + BLENDFUNCTION BlendFunc; + register NICEPIXEL32 DstPixel; + register NICEPIXEL32 SrcPixel; + register NICEPIXEL16 SrcPixel16; + UCHAR Alpha, SrcBpp; + HPALETTE SrcPalette, DstPalette; + XLATEOBJ *SrcTo32Xlate, *DstTo32Xlate, *DstFrom32Xlate; + + DPRINT("DIB_8BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + + ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top && + DestRect->right - DestRect->left == SourceRect->right - SourceRect->left); + + BlendFunc = BlendObj->BlendFunction; + if (BlendFunc.BlendOp != AC_SRC_OVER) + { + DPRINT1("BlendOp != AC_SRC_OVER\n"); + return FALSE; + } + if (BlendFunc.BlendFlags != 0) + { + DPRINT1("BlendFlags != 0\n"); + return FALSE; + } + if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0) + { + DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat); + return FALSE; + } + if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 && + BitsPerFormat(Source->iBitmapFormat) != 32) + { + DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n"); + return FALSE; + } + + SrcBpp = BitsPerFormat(Source->iBitmapFormat); + SrcPalette = IntEngGetXlatePalette(ColorTranslation, XO_SRCPALETTE); + if (SrcPalette != 0) + { + SrcTo32Xlate = IntEngCreateXlate(PAL_RGB, 0, NULL, SrcPalette); + if (SrcTo32Xlate == NULL) + { + DPRINT1("IntEngCreateXlate failed\n"); + return FALSE; + } + } + else + { + SrcTo32Xlate = NULL; + ASSERT(SrcBpp >= 16); + } + + DstPalette = IntEngGetXlatePalette(ColorTranslation, XO_DESTPALETTE); + DstTo32Xlate = IntEngCreateXlate(PAL_RGB, 0, NULL, DstPalette); + DstFrom32Xlate = IntEngCreateXlate(0, PAL_RGB, DstPalette, NULL); + if (DstTo32Xlate == NULL || DstFrom32Xlate == NULL) + { + if (SrcTo32Xlate != NULL) + EngDeleteXlate(SrcTo32Xlate); + if (DstTo32Xlate != NULL) + EngDeleteXlate(DstTo32Xlate); + if (DstFrom32Xlate != NULL) + EngDeleteXlate(DstFrom32Xlate); + DPRINT1("IntEngCreateXlate failed\n"); + return FALSE; + } + + Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) + + DestRect->left); + DstDelta = Dest->lDelta - (DestRect->right - DestRect->left); + + Rows = DestRect->bottom - DestRect->top; + SrcY = SourceRect->top; + while (--Rows >= 0) + { + Cols = DestRect->right - DestRect->left; + SrcX = SourceRect->left; + while (--Cols >= 0) + { + if (SrcTo32Xlate != NULL) + { + SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, SrcTo32Xlate); + } + else if (SrcBpp <= 16) + { + SrcPixel16.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); + SrcPixel.col.red = (SrcPixel16.col.red << 3) | (SrcPixel16.col.red >> 2); + SrcPixel.col.green = (SrcPixel16.col.green << 2) | (SrcPixel16.col.green >> 4); + SrcPixel.col.blue = (SrcPixel16.col.blue << 3) | (SrcPixel16.col.blue >> 2); + } + else + { + SrcPixel.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY); + } + SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255; + SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha; + + Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? + SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; + + DstPixel.ul = XLATEOBJ_iXlate(DstTo32Xlate, *Dst); + DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red); + DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green); + DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue); + *Dst++ = XLATEOBJ_iXlate(DstFrom32Xlate, DstPixel.ul); + } + Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta); + SrcY++; + } + + if (SrcTo32Xlate != NULL) + EngDeleteXlate(SrcTo32Xlate); + if (DstTo32Xlate != NULL) + EngDeleteXlate(DstTo32Xlate); + if (DstFrom32Xlate != NULL) + EngDeleteXlate(DstFrom32Xlate); + + return TRUE; +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/eng/bitblt.c --- trunk/reactos/subsys/win32k/eng/bitblt.c 2005-11-04 23:25:03 UTC (rev 19007) +++ trunk/reactos/subsys/win32k/eng/bitblt.c 2005-11-04 23:37:06 UTC (rev 19008) @@ -889,60 +889,320 @@
return ret; }
+BOOL +STDCALL +EngAlphaBlend(IN SURFOBJ *Dest, + IN SURFOBJ *Source, + IN CLIPOBJ *ClipRegion, + IN XLATEOBJ *ColorTranslation, + IN PRECTL DestRect, + IN PRECTL SourceRect, + IN BLENDOBJ *BlendObj) +{ + RECTL SourceStretchedRect; + SIZEL SourceStretchedSize; + HBITMAP SourceStretchedBitmap = 0; + SURFOBJ* SourceStretchedObj = NULL; + RECTL InputRect; + RECTL OutputRect; + RECTL ClipRect; + RECTL CombinedRect; + RECTL Rect; + POINTL Translate; + INTENG_ENTER_LEAVE EnterLeaveSource; + INTENG_ENTER_LEAVE EnterLeaveDest; + SURFOBJ* InputObj; + SURFOBJ* OutputObj; + LONG Width; + LONG ClippingType; + RECT_ENUM RectEnum; + BOOL EnumMore; + INT i; + BOOLEAN Ret; + + DPRINT("EngAlphaBlend(Dest:0x%p, Source:0x%p, ClipRegion:0x%p, ColorTranslation:0x%p,\n", Dest, Source, ClipRegion, ColorTranslation); + DPRINT(" DestRect:{0x%x, 0x%x, 0x%x, 0x%x}, SourceRect:{0x%x, 0x%x, 0x%x, 0x%x},\n", + DestRect->left, DestRect->top, DestRect->right, DestRect->bottom, + SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom); + DPRINT(" BlendObj:{0x%x, 0x%x, 0x%x, 0x%x}\n", BlendObj->BlendFunction.BlendOp, + BlendObj->BlendFunction.BlendFlags, BlendObj->BlendFunction.SourceConstantAlpha, + BlendObj->BlendFunction.AlphaFormat); + + /* Validate input */ + if (DestRect->left >= DestRect->right || DestRect->top >= DestRect->bottom) + { + DPRINT1("Empty destination rectangle!\n"); + return FALSE; + } + if (SourceRect->left >= SourceRect->right || SourceRect->top >= SourceRect->bottom) + { + DPRINT1("Empty source rectangle!\n"); + return FALSE; + } + if (Dest == Source && + !(DestRect->left >= SourceRect->right || SourceRect->left >= DestRect->right || + DestRect->top >= SourceRect->bottom || SourceRect->top >= DestRect->bottom)) + { + DPRINT1("Source and destination rectangles overlap!\n"); + return FALSE; + } + + if (BlendObj->BlendFunction.BlendOp != AC_SRC_OVER) + { + DPRINT1("BlendOp != AC_SRC_OVER (0x%x)\n", BlendObj->BlendFunction.BlendOp); + return FALSE; + } + if (BlendObj->BlendFunction.BlendFlags != 0) + { + DPRINT1("BlendFlags != 0 (0x%x)\n", BlendObj->BlendFunction.BlendFlags); + return FALSE; + } + if ((BlendObj->BlendFunction.AlphaFormat & ~AC_SRC_ALPHA) != 0) + { + DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendObj->BlendFunction.AlphaFormat); + return FALSE; + } + + /* Check if there is anything to draw */ + if (ClipRegion != NULL && + (ClipRegion->rclBounds.left >= ClipRegion->rclBounds.right || + ClipRegion->rclBounds.top >= ClipRegion->rclBounds.bottom)) + { + /* Nothing to do */ + return TRUE; + } + + /* Stretch source if needed */ + if (DestRect->right - DestRect->left != SourceRect->right - SourceRect->left || + DestRect->bottom - DestRect->top != SourceRect->bottom - SourceRect->top) + { + SourceStretchedSize.cx = DestRect->right - DestRect->left; + SourceStretchedSize.cy = DestRect->bottom - DestRect->top; + Width = DIB_GetDIBWidthBytes(SourceStretchedSize.cx, BitsPerFormat(Source->iBitmapFormat)); + /* FIXME: Maybe it is a good idea to use EngCreateDeviceBitmap and IntEngStretchBlt + if possible to get a HW accelerated stretch. */ + SourceStretchedBitmap = EngCreateBitmap(SourceStretchedSize, Width, Source->iBitmapFormat, + BMF_TOPDOWN | BMF_NOZEROINIT, NULL); + if (SourceStretchedBitmap == 0) + { + DPRINT1("EngCreateBitmap failed!\n"); + return FALSE; + } + SourceStretchedObj = EngLockSurface((HSURF)SourceStretchedBitmap); + if (SourceStretchedObj == NULL) + { + DPRINT1("EngLockSurface failed!\n"); + EngDeleteSurface((HSURF)SourceStretchedBitmap); + return FALSE; + } + + SourceStretchedRect.left = 0; + SourceStretchedRect.right = SourceStretchedSize.cx; + SourceStretchedRect.top = 0; + SourceStretchedRect.bottom = SourceStretchedSize.cy; + /* FIXME: IntEngStretchBlt isn't used here atm because it results in a + try to acquire an already acquired mutex (lock the already locked source surface) */ + /*if (!IntEngStretchBlt(SourceStretchedObj, Source, NULL, NULL, + NULL, &SourceStretchedRect, SourceRect, NULL, + NULL, NULL, COLORONCOLOR))*/ + if (!EngStretchBlt(SourceStretchedObj, Source, NULL, NULL, NULL, + NULL, NULL, &SourceStretchedRect, SourceRect, + NULL, COLORONCOLOR)) + { + DPRINT1("EngStretchBlt failed!\n"); + EngFreeMem(SourceStretchedObj->pvBits); + EngUnlockSurface(SourceStretchedObj); + EngDeleteSurface((HSURF)SourceStretchedBitmap); + return FALSE; + } + SourceRect = &SourceStretchedRect; + Source = SourceStretchedObj; + } + + /* Now call the DIB function */ + InputRect.left = SourceRect->left; + InputRect.right = SourceRect->right; + InputRect.top = SourceRect->top; + InputRect.bottom = SourceRect->bottom; + if (!IntEngEnter(&EnterLeaveSource, Source, &InputRect, TRUE, &Translate, &InputObj)) + { + if (SourceStretchedObj != NULL) + { + EngFreeMem(SourceStretchedObj->pvBits); + EngUnlockSurface(SourceStretchedObj); + } + if (SourceStretchedBitmap != 0) + { + EngDeleteSurface((HSURF)SourceStretchedBitmap); + } + return FALSE; + } + InputRect.left = SourceRect->left + Translate.x; + InputRect.right = SourceRect->right + Translate.x; + InputRect.top = SourceRect->top + Translate.y; + InputRect.bottom = SourceRect->bottom + Translate.y; + + OutputRect.left = DestRect->left; + OutputRect.right = DestRect->right; + OutputRect.top = DestRect->top; + OutputRect.bottom = DestRect->bottom; + if (!IntEngEnter(&EnterLeaveDest, Dest, &OutputRect, FALSE, &Translate, &OutputObj)) + { + IntEngLeave(&EnterLeaveSource); + if (SourceStretchedObj != NULL) + { + EngFreeMem(SourceStretchedObj->pvBits); + EngUnlockSurface(SourceStretchedObj); + } + if (SourceStretchedBitmap != 0) + { + EngDeleteSurface((HSURF)SourceStretchedBitmap); + } + return FALSE; + } + OutputRect.left = DestRect->left + Translate.x; + OutputRect.right = DestRect->right + Translate.x; + OutputRect.top = DestRect->top + Translate.y; + OutputRect.bottom = DestRect->bottom + Translate.y; + + Ret = FALSE; + ClippingType = (ClipRegion == NULL) ? DC_TRIVIAL : ClipRegion->iDComplexity; + switch(ClippingType) + { + case DC_TRIVIAL: + Ret = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_AlphaBlend( + OutputObj, InputObj, &OutputRect, &InputRect, ClipRegion, ColorTranslation, BlendObj); + break; + + case DC_RECT: + ClipRect.left = ClipRegion->rclBounds.left + Translate.x; + ClipRect.right = ClipRegion->rclBounds.right + Translate.x; + ClipRect.top = ClipRegion->rclBounds.top + Translate.y; + ClipRect.bottom = ClipRegion->rclBounds.bottom + Translate.y; + if (EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect)) + { + Rect.left = InputRect.left + CombinedRect.left - OutputRect.left; + Rect.right = InputRect.right + CombinedRect.right - OutputRect.right; + Rect.top = InputRect.top + CombinedRect.top - OutputRect.top; + Rect.bottom = InputRect.bottom + CombinedRect.bottom - OutputRect.bottom; + Ret = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_AlphaBlend( + OutputObj, InputObj, &CombinedRect, &Rect, ClipRegion, ColorTranslation, BlendObj); + } + break; + + case DC_COMPLEX: + Ret = TRUE; + CLIPOBJ_cEnumStart(ClipRegion, FALSE, CT_RECTANGLES, CD_ANY, 0); + do + { + EnumMore = CLIPOBJ_bEnum(ClipRegion,(ULONG) sizeof(RectEnum), + (PVOID) &RectEnum); + + for (i = 0; i < RectEnum.c; i++) + { + ClipRect.left = RectEnum.arcl[i].left + Translate.x; + ClipRect.right = RectEnum.arcl[i].right + Translate.x; + ClipRect.top = RectEnum.arcl[i].top + Translate.y; + ClipRect.bottom = RectEnum.arcl[i].bottom + Translate.y; + if (EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect)) + { + Rect.left = InputRect.left + CombinedRect.left - OutputRect.left; + Rect.right = InputRect.right + CombinedRect.right - OutputRect.right; + Rect.top = InputRect.top + CombinedRect.top - OutputRect.top; + Rect.bottom = InputRect.bottom + CombinedRect.bottom - OutputRect.bottom; + Ret = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_AlphaBlend( + OutputObj, InputObj, &CombinedRect, &Rect, ClipRegion, ColorTranslation, BlendObj) && Ret; + } + } + } + while(EnumMore); + break; + + default: + UNIMPLEMENTED; + ASSERT(FALSE); + break; + } + + IntEngLeave(&EnterLeaveDest); + IntEngLeave(&EnterLeaveSource); + + if (SourceStretchedObj != NULL) + { + EngFreeMem(SourceStretchedObj->pvBits); + EngUnlockSurface(SourceStretchedObj); + } + if (SourceStretchedBitmap != 0) + { + EngDeleteSurface((HSURF)SourceStretchedBitmap); + } + + return Ret; +} + BOOL STDCALL IntEngAlphaBlend(IN SURFOBJ *Dest, IN SURFOBJ *Source, - IN CLIPOBJ *Clip, + IN CLIPOBJ *ClipRegion, IN XLATEOBJ *ColorTranslation, IN PRECTL DestRect, IN PRECTL SourceRect, IN BLENDOBJ *BlendObj) { - BOOL ret = FALSE; - BITMAPOBJ *DestObj; - BITMAPOBJ *SourceObj; + BOOL ret = FALSE; + BITMAPOBJ *DestObj; + BITMAPOBJ *SourceObj;
- ASSERT(Dest); - DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj); - ASSERT(DestObj); + ASSERT(Dest); + DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj); + ASSERT(DestObj);
- ASSERT(Source); - SourceObj = CONTAINING_RECORD(Source, BITMAPOBJ, SurfObj); - ASSERT(SourceObj); + ASSERT(Source); + SourceObj = CONTAINING_RECORD(Source, BITMAPOBJ, SurfObj); + ASSERT(SourceObj);
[truncated at 1000 lines; 164 more skipped]