Add IntEngAlphaBlend and NtGdiAlphaBlend functions, EngAlphaBlend (the real implementation) is still missing.
Modified: trunk/reactos/subsys/win32k/eng/bitblt.c
Modified: trunk/reactos/subsys/win32k/include/inteng.h
Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c

Modified: trunk/reactos/subsys/win32k/eng/bitblt.c
--- trunk/reactos/subsys/win32k/eng/bitblt.c	2005-10-30 22:14:11 UTC (rev 18895)
+++ trunk/reactos/subsys/win32k/eng/bitblt.c	2005-10-30 22:16:30 UTC (rev 18896)
@@ -889,6 +889,62 @@
   return ret;
 }
 
+BOOL STDCALL
+IntEngAlphaBlend(IN SURFOBJ *Dest,
+                 IN SURFOBJ *Source,
+                 IN CLIPOBJ *Clip,
+                 IN XLATEOBJ *ColorTranslation,
+                 IN PRECTL DestRect,
+                 IN PRECTL SourceRect,
+                 IN BLENDOBJ *BlendObj)
+{
+	BOOL ret = FALSE;
+	BITMAPOBJ *DestObj;
+	BITMAPOBJ *SourceObj;
+
+	ASSERT(Dest);
+	DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj);
+	ASSERT(DestObj);
+
+	ASSERT(Source);
+	SourceObj = CONTAINING_RECORD(Source, BITMAPOBJ, SurfObj);
+	ASSERT(SourceObj);
+
+	ASSERT(DestRect);
+	ASSERT(SourceRect);
+
+	BITMAPOBJ_LockBitmapBits(DestObj);
+	MouseSafetyOnDrawStart(Dest, DestRect->left, DestRect->top,
+	                       DestRect->right, DestRect->bottom);
+
+	if (Source != Dest)
+		BITMAPOBJ_LockBitmapBits(SourceObj);
+	MouseSafetyOnDrawStart(Source, SourceRect->left, SourceRect->top,
+	                       SourceRect->right, SourceRect->bottom);
+
+	/* Call the driver's DrvAlphaBlend if available */
+	if (DestObj->flHooks & HOOK_ALPHABLEND)
+	{
+		ret = GDIDEVFUNCS(Dest).AlphaBlend(
+		                  Dest, Source, Clip, ColorTranslation,
+		                  DestRect, SourceRect, BlendObj);
+	}
+
+	if (! ret)
+	{
+		ret = EngAlphaBlend(Dest, Source, Clip, ColorTranslation,
+		                    DestRect, SourceRect, BlendObj);
+	}
+
+	MouseSafetyOnDrawEnd(Source);
+	if (Source != Dest)
+		BITMAPOBJ_UnlockBitmapBits(SourceObj);
+	MouseSafetyOnDrawEnd(Dest);
+	BITMAPOBJ_UnlockBitmapBits(DestObj);
+
+	return ret;
+}
+
 /**** REACTOS FONT RENDERING CODE *********************************************/
 
 /* renders the alpha mask bitmap */

Modified: trunk/reactos/subsys/win32k/include/inteng.h
--- trunk/reactos/subsys/win32k/include/inteng.h	2005-10-30 22:14:11 UTC (rev 18895)
+++ trunk/reactos/subsys/win32k/include/inteng.h	2005-10-30 22:16:30 UTC (rev 18896)
@@ -162,5 +162,14 @@
                   IN LONG y,
                   IN RECTL *prcl);
 
+BOOL STDCALL
+IntEngAlphaBlend(IN SURFOBJ *Dest,
+                 IN SURFOBJ *Source,
+                 IN CLIPOBJ *Clip,
+                 IN XLATEOBJ *ColorTranslation,
+                 IN PRECTL DestRect,
+                 IN PRECTL SourceRect,
+                 IN BLENDOBJ *BlendObj);
 
+
 #endif /* _WIN32K_INTENG_H */

Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c
--- trunk/reactos/subsys/win32k/objects/bitmaps.c	2005-10-30 22:14:11 UTC (rev 18895)
+++ trunk/reactos/subsys/win32k/objects/bitmaps.c	2005-10-30 22:16:30 UTC (rev 18896)
@@ -1284,6 +1284,145 @@
 	return Status;
 }
 
+BOOL STDCALL
+NtGdiAlphaBlend(
+	HDC  hDCDest,
+	INT  XOriginDest,
+	INT  YOriginDest,
+	INT  WidthDest,
+	INT  HeightDest,
+	HDC  hDCSrc,
+	INT  XOriginSrc,
+	INT  YOriginSrc,
+	INT  WidthSrc,
+	INT  HeightSrc,
+	BLENDFUNCTION  BlendFunc)
+{
+	PDC DCDest = NULL;
+	PDC DCSrc  = NULL;
+	BITMAPOBJ *BitmapDest, *BitmapSrc;
+	RECTL DestRect, SourceRect;
+	BOOL Status;
+	XLATEOBJ *XlateObj;
+	BLENDOBJ BlendObj = {BlendFunc};
+	HPALETTE SourcePalette = 0, DestPalette = 0;
+
+	DCDest = DC_LockDc(hDCDest);
+	if (NULL == DCDest)
+	{
+		DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiAlphaBlend\n", hDCDest);
+		SetLastWin32Error(ERROR_INVALID_HANDLE);
+		return FALSE;
+	}
+	if (DCDest->IsIC)
+	{
+		DC_UnlockDc(DCDest);
+		/* Yes, Windows really returns TRUE in this case */
+		return TRUE;
+	}
+
+	if (hDCSrc != hDCDest)
+	{
+		DCSrc = DC_LockDc(hDCSrc);
+		if (NULL == DCSrc)
+		{
+			DC_UnlockDc(DCDest);
+			DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc);
+			SetLastWin32Error(ERROR_INVALID_HANDLE);
+			return FALSE;
+		}
+		if (DCSrc->IsIC)
+		{
+			DC_UnlockDc(DCSrc);
+			DC_UnlockDc(DCDest);
+			/* Yes, Windows really returns TRUE in this case */
+			return TRUE;
+		}
+	}
+	else
+	{
+		DCSrc = DCDest;
+	}
+
+	/* Offset the destination and source by the origin of their DCs. */
+	XOriginDest += DCDest->w.DCOrgX;
+	YOriginDest += DCDest->w.DCOrgY;
+	XOriginSrc += DCSrc->w.DCOrgX;
+	YOriginSrc += DCSrc->w.DCOrgY;
+
+	DestRect.left   = XOriginDest;
+	DestRect.top    = YOriginDest;
+	DestRect.right  = XOriginDest + WidthDest;
+	DestRect.bottom = YOriginDest + HeightDest;
+
+	SourceRect.left   = XOriginSrc;
+	SourceRect.top    = YOriginSrc;
+	SourceRect.right  = XOriginSrc + WidthSrc;
+	SourceRect.bottom = YOriginSrc + HeightSrc;
+
+	/* Determine surfaces to be used in the bitblt */
+	BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
+	if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
+		BitmapSrc = BitmapDest;
+	else
+		BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
+
+	/* Create the XLATEOBJ. */
+	if (DCDest->w.hPalette != 0)
+		DestPalette = DCDest->w.hPalette;
+	if (DCSrc->w.hPalette != 0)
+		SourcePalette = DCSrc->w.hPalette;
+
+	/* KB41464 details how to convert between mono and color */
+	if (DCDest->w.bitsPerPixel == 1 && DCSrc->w.bitsPerPixel == 1)
+	{
+		XlateObj = NULL;
+	}
+	else
+	{
+		if (DCDest->w.bitsPerPixel == 1)
+		{
+			XlateObj = IntEngCreateMonoXlate(0, DestPalette, SourcePalette, DCSrc->w.backgroundColor);
+		}
+		else if (DCSrc->w.bitsPerPixel == 1)
+		{
+			XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->w.backgroundColor, DCSrc->w.textColor);
+		}
+		else
+		{
+			XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette);
+		}
+		if (NULL == XlateObj)
+		{
+			BITMAPOBJ_UnlockBitmap(BitmapDest);
+			if (BitmapSrc != BitmapDest)
+				BITMAPOBJ_UnlockBitmap(BitmapSrc);
+			DC_UnlockDc(DCDest);
+			if (hDCSrc != hDCDest)
+				DC_UnlockDc(DCSrc);
+			SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+			return FALSE;
+		}
+	}
+
+	/* Perform the alpha blend operation */
+	Status = IntEngAlphaBlend(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
+	                          DCDest->CombinedClip, XlateObj,
+	                          &DestRect, &SourceRect, &BlendObj);
+
+	if (XlateObj != NULL)
+		EngDeleteXlate(XlateObj);
+
+	BITMAPOBJ_UnlockBitmap(BitmapDest);
+	if (BitmapSrc != BitmapDest)
+		BITMAPOBJ_UnlockBitmap(BitmapSrc);
+	DC_UnlockDc(DCDest);
+	if (hDCSrc != hDCDest)
+		DC_UnlockDc(DCSrc);
+
+	return Status;
+}
+
 /*  Internal Functions  */
 
 INT FASTCALL