[ros-diffs] [tkreuzer] 28302: move NtGdiBitBlt, NtGdiTransparentBlt, NtGdiExtFloodFill, NtGdiMaskBlt, NtGdiPlgBlt, NtGdiStretchBlt, NtGdiAlphaBlend from bitmaps.c to painting.c

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sun Aug 12 18:20:29 CEST 2007


Author: tkreuzer
Date: Sun Aug 12 20:20:29 2007
New Revision: 28302

URL: http://svn.reactos.org/svn/reactos?rev=28302&view=rev
Log:
move NtGdiBitBlt, NtGdiTransparentBlt, NtGdiExtFloodFill, NtGdiMaskBlt, NtGdiPlgBlt, NtGdiStretchBlt, NtGdiAlphaBlend from bitmaps.c to painting.c

Added:
    trunk/reactos/subsystems/win32/win32k/objects/painting.c
Modified:
    trunk/reactos/subsystems/win32/win32k/objects/bitmaps.c
    trunk/reactos/subsystems/win32/win32k/win32k.rbuild

Modified: trunk/reactos/subsystems/win32/win32k/objects/bitmaps.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/bitmaps.c?rev=28302&r1=28301&r2=28302&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/bitmaps.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/bitmaps.c Sun Aug 12 20:20:29 2007
@@ -31,375 +31,6 @@
  (y) < (r).bottom \
 )
 
-BOOL STDCALL
-NtGdiBitBlt(
-	HDC  hDCDest,
-	INT  XDest,
-	INT  YDest,
-	INT  Width,
-	INT  Height,
-	HDC  hDCSrc,
-	INT  XSrc,
-	INT  YSrc,
-	DWORD  ROP,
-	IN DWORD crBackColor,
-	IN FLONG fl)
-{
-	PDC DCDest = NULL;
-	PDC DCSrc  = NULL;
-	BITMAPOBJ *BitmapDest, *BitmapSrc;
-	RECTL DestRect;
-	POINTL SourcePoint, BrushOrigin;
-	BOOL Status;
-	XLATEOBJ *XlateObj = NULL;
-	HPALETTE SourcePalette = 0, DestPalette = 0;
-	PGDIBRUSHOBJ BrushObj;
-	GDIBRUSHINST BrushInst;
-	BOOL UsesSource = ROP3_USES_SOURCE(ROP);
-	BOOL UsesPattern = ROP3_USES_PATTERN(ROP);
-
-	DCDest = DC_LockDc(hDCDest);
-	if (NULL == DCDest)
-	{
-		DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\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 (UsesSource)
-	{
-		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;
-		}
-	}
-	else
-	{
-		DCSrc = NULL;
-	}
-
-	/* Offset the destination and source by the origin of their DCs. */
-	XDest += DCDest->w.DCOrgX;
-	YDest += DCDest->w.DCOrgY;
-	if (UsesSource)
-	{
-		XSrc += DCSrc->w.DCOrgX;
-		YSrc += DCSrc->w.DCOrgY;
-	}
-
-	DestRect.left   = XDest;
-	DestRect.top    = YDest;
-	DestRect.right  = XDest+Width;
-	DestRect.bottom = YDest+Height;
-
-	IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2);
-
-	SourcePoint.x = XSrc;
-	SourcePoint.y = YSrc;
-
-	BrushOrigin.x = 0;
-	BrushOrigin.y = 0;
-
-	/* Determine surfaces to be used in the bitblt */
-	BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
-	if (UsesSource)
-	{
-		if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
-			BitmapSrc = BitmapDest;
-		else
-			BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
-	}
-	else
-	{
-		BitmapSrc = NULL;
-	}
-
-	if (UsesPattern)
-	{
-		BrushObj = BRUSHOBJ_LockBrush(DCDest->Dc_Attr.hbrush);
-		if (NULL == BrushObj)
-		{
-			if (UsesSource && hDCSrc != hDCDest)
-			{
-				DC_UnlockDc(DCSrc);
-			}
-			if(BitmapDest != NULL)
-			{
-				BITMAPOBJ_UnlockBitmap(BitmapDest);
-			}
-			if(BitmapSrc != NULL && BitmapSrc != BitmapDest)
-			{
-				BITMAPOBJ_UnlockBitmap(BitmapSrc);
-			}
-			DC_UnlockDc(DCDest);
-			SetLastWin32Error(ERROR_INVALID_HANDLE);
-			return FALSE;
-		}
-		BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin);
-		IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush);
-	}
-	else
-	{
-		BrushObj = NULL;
-	}
-
-	/* Create the XLATEOBJ. */
-	if (UsesSource)
-	{
-		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->Dc_Attr.crBackgroundClr);
-			}
-			else if (DCSrc->w.bitsPerPixel == 1)
-			{
-				XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->Dc_Attr.crBackgroundClr, DCSrc->Dc_Attr.crForegroundClr);
-			}
-			else
-			{
-				XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette);
-			}
-			if (NULL == XlateObj)
-			{
-				if (UsesSource && hDCSrc != hDCDest)
-				{
-					DC_UnlockDc(DCSrc);
-				}
-				DC_UnlockDc(DCDest);
-				if(BitmapDest != NULL)
-				{
-					BITMAPOBJ_UnlockBitmap(BitmapDest);
-				}
-				if(BitmapSrc != NULL && BitmapSrc != BitmapDest)
-				{
-					BITMAPOBJ_UnlockBitmap(BitmapSrc);
-				}
-				if(BrushObj != NULL)
-				{
-					BRUSHOBJ_UnlockBrush(BrushObj);
-				}
-				SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
-				return FALSE;
-			}
-		}
-	}
-
-	/* Perform the bitblt operation */
-	Status = IntEngBitBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, NULL,
-                          DCDest->CombinedClip, XlateObj, &DestRect,
-                          &SourcePoint, NULL,
-                          BrushObj ? &BrushInst.BrushObject : NULL,
-                          &BrushOrigin, ROP3_TO_ROP4(ROP));
-
-	if (UsesSource && XlateObj != NULL)
-		EngDeleteXlate(XlateObj);
-
-	if(BitmapDest != NULL)
-	{
-		BITMAPOBJ_UnlockBitmap(BitmapDest);
-	}
-	if (UsesSource && BitmapSrc != BitmapDest)
-	{
-		BITMAPOBJ_UnlockBitmap(BitmapSrc);
-	}
-	if (BrushObj != NULL)
-	{
-		BRUSHOBJ_UnlockBrush(BrushObj);
-	}
-	if (UsesSource && hDCSrc != hDCDest)
-	{
-		DC_UnlockDc(DCSrc);
-	}
-	DC_UnlockDc(DCDest);
-
-	return Status;
-}
-
-BOOL STDCALL
-NtGdiTransparentBlt(
-	HDC			hdcDst,
-	INT			xDst,
-	INT			yDst,
-	INT			cxDst,
-	INT			cyDst,
-	HDC			hdcSrc,
-	INT			xSrc,
-	INT			ySrc,
-	INT			cxSrc,
-	INT			cySrc,
-	COLORREF	TransColor)
-{
-  PDC DCDest, DCSrc;
-  RECTL rcDest, rcSrc;
-  BITMAPOBJ *BitmapDest, *BitmapSrc;
-  XLATEOBJ *XlateObj;
-  HPALETTE SourcePalette = 0, DestPalette = 0;
-  PPALGDI PalDestGDI, PalSourceGDI;
-  USHORT PalDestMode, PalSrcMode;
-  ULONG TransparentColor = 0;
-  BOOL Ret = FALSE;
-
-  if(!(DCDest = DC_LockDc(hdcDst)))
-  {
-    DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcDst);
-    SetLastWin32Error(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-  if (DCDest->IsIC)
-  {
-    DC_UnlockDc(DCDest);
-    /* Yes, Windows really returns TRUE in this case */
-    return TRUE;
-  }
-
-  if((hdcDst != hdcSrc) && !(DCSrc = DC_LockDc(hdcSrc)))
-  {
-    DC_UnlockDc(DCDest);
-    DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcSrc);
-    SetLastWin32Error(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-  if(hdcDst == hdcSrc)
-  {
-    DCSrc = DCDest;
-  }
-  if (DCSrc->IsIC)
-  {
-    DC_UnlockDc(DCSrc);
-    if(hdcDst != hdcSrc)
-    {
-      DC_UnlockDc(DCDest);
-    }
-    /* Yes, Windows really returns TRUE in this case */
-    return TRUE;
-  }
-
-  /* Offset positions */
-  xDst += DCDest->w.DCOrgX;
-  yDst += DCDest->w.DCOrgY;
-  xSrc += DCSrc->w.DCOrgX;
-  ySrc += DCSrc->w.DCOrgY;
-
-  if(DCDest->w.hPalette)
-    DestPalette = DCDest->w.hPalette;
-
-  if(DCSrc->w.hPalette)
-    SourcePalette = DCSrc->w.hPalette;
-
-  if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette)))
-  {
-    DC_UnlockDc(DCSrc);
-    DC_UnlockDc(DCDest);
-    SetLastWin32Error(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-  if((DestPalette != SourcePalette) && !(PalDestGDI = PALETTE_LockPalette(DestPalette)))
-  {
-    PALETTE_UnlockPalette(PalSourceGDI);
-    DC_UnlockDc(DCSrc);
-    DC_UnlockDc(DCDest);
-    SetLastWin32Error(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-  if(DestPalette != SourcePalette)
-  {
-    PalDestMode = PalDestGDI->Mode;
-    PalSrcMode = PalSourceGDI->Mode;
-    PALETTE_UnlockPalette(PalDestGDI);
-  }
-  else
-  {
-    PalDestMode = PalSrcMode = PalSourceGDI->Mode;
-  }
-  PALETTE_UnlockPalette(PalSourceGDI);
-
-  /* Translate Transparent (RGB) Color to the source palette */
-  if((XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL)))
-  {
-    TransparentColor = XLATEOBJ_iXlate(XlateObj, (ULONG)TransColor);
-    EngDeleteXlate(XlateObj);
-  }
-
-  /* Create the XLATE object to convert colors between source and destination */
-  XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette);
-
-  BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
-  /* FIXME - BitmapDest can be NULL!!!! Don't assert here! */
-  ASSERT(BitmapDest);
-  BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
-  /* FIXME - BitmapSrc can be NULL!!!! Don't assert here! */
-  ASSERT(BitmapSrc);
-
-  rcDest.left = xDst;
-  rcDest.top = yDst;
-  rcDest.right = rcDest.left + cxDst;
-  rcDest.bottom = rcDest.top + cyDst;
-  rcSrc.left = xSrc;
-  rcSrc.top = ySrc;
-  rcSrc.right = rcSrc.left + cxSrc;
-  rcSrc.bottom = rcSrc.top + cySrc;
-
-  if((cxDst != cxSrc) || (cyDst != cySrc))
-  {
-    DPRINT1("TransparentBlt() does not support stretching at the moment!\n");
-    goto done;
-  }
-
-  Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
-                             DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc,
-                             TransparentColor, 0);
-
-done:
-  BITMAPOBJ_UnlockBitmap(BitmapDest);
-  BITMAPOBJ_UnlockBitmap(BitmapSrc);
-  DC_UnlockDc(DCSrc);
-  if(hdcDst != hdcSrc)
-  {
-    DC_UnlockDc(DCDest);
-  }
-  if(XlateObj)
-  {
-    EngDeleteXlate(XlateObj);
-  }
-  return Ret;
-}
-
 HBITMAP STDCALL
 NtGdiCreateBitmap(
     INT  Width,
@@ -555,20 +186,6 @@
 	DPRINT ("\t\t%04x\n", Bmp);
 	DC_UnlockDc(Dc);
 	return Bmp;
-}
-
-BOOL STDCALL
-NtGdiExtFloodFill(
-	HDC  hDC,
-	INT  XStart,
-	INT  YStart,
-	COLORREF  Color,
-	UINT  FillType)
-{
-	DPRINT1("FIXME: NtGdiExtFloodFill is UNIMPLEMENTED\n");
-
-	/* lie and say we succeded */
-	return TRUE;
 }
 
 BOOL STDCALL
@@ -683,237 +300,6 @@
 	return Result;
 }
 
-/***********************************************************************
- * MaskBlt
- * Ported from WINE by sedwards 11-4-03
- *
- * Someone thought it would be faster to do it here and then switch back
- * to GDI32. I dunno. Write a test and let me know.
- */
-
-static __inline BYTE
-SwapROP3_SrcDst(BYTE bRop3)
-{
-	return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1);
-}
-
-#define FRGND_ROP3(ROP4)	((ROP4) & 0x00FFFFFF)
-#define BKGND_ROP3(ROP4)	(ROP3Table[(SwapROP3_SrcDst((ROP4)>>24)) & 0xFF])
-#define DSTCOPY 		0x00AA0029
-#define DSTERASE		0x00220326 /* dest = dest & (~src) : DSna */
-
-BOOL STDCALL
-NtGdiMaskBlt (
-	HDC hdcDest, INT nXDest, INT nYDest,
-	INT nWidth, INT nHeight, HDC hdcSrc,
-	INT nXSrc, INT nYSrc, HBITMAP hbmMask,
-	INT xMask, INT yMask, DWORD dwRop,
-	IN DWORD crBackColor)
-{
-	HBITMAP hOldMaskBitmap, hBitmap2, hOldBitmap2, hBitmap3, hOldBitmap3;
-	HDC hDCMask, hDC1, hDC2;
-	static const DWORD ROP3Table[256] =
-	{
-		0x00000042, 0x00010289,
-		0x00020C89, 0x000300AA,
-		0x00040C88, 0x000500A9,
-		0x00060865, 0x000702C5,
-		0x00080F08, 0x00090245,
-		0x000A0329, 0x000B0B2A,
-		0x000C0324, 0x000D0B25,
-		0x000E08A5, 0x000F0001,
-		0x00100C85, 0x001100A6,
-		0x00120868, 0x001302C8,
-		0x00140869, 0x001502C9,
-		0x00165CCA, 0x00171D54,
-		0x00180D59, 0x00191CC8,
-		0x001A06C5, 0x001B0768,
-		0x001C06CA, 0x001D0766,
-		0x001E01A5, 0x001F0385,
-		0x00200F09, 0x00210248,
-		0x00220326, 0x00230B24,
-		0x00240D55, 0x00251CC5,
-		0x002606C8, 0x00271868,
-		0x00280369, 0x002916CA,
-		0x002A0CC9, 0x002B1D58,
-		0x002C0784, 0x002D060A,
-		0x002E064A, 0x002F0E2A,
-		0x0030032A, 0x00310B28,
-		0x00320688, 0x00330008,
-		0x003406C4, 0x00351864,
-		0x003601A8, 0x00370388,
-		0x0038078A, 0x00390604,
-		0x003A0644, 0x003B0E24,
-		0x003C004A, 0x003D18A4,
-		0x003E1B24, 0x003F00EA,
-		0x00400F0A, 0x00410249,
-		0x00420D5D, 0x00431CC4,
-		0x00440328, 0x00450B29,
-		0x004606C6, 0x0047076A,
-		0x00480368, 0x004916C5,
-		0x004A0789, 0x004B0605,
-		0x004C0CC8, 0x004D1954,
-		0x004E0645, 0x004F0E25,
-		0x00500325, 0x00510B26,
-		0x005206C9, 0x00530764,
-		0x005408A9, 0x00550009,
-		0x005601A9, 0x00570389,
-		0x00580785, 0x00590609,
-		0x005A0049, 0x005B18A9,
-		0x005C0649, 0x005D0E29,
-		0x005E1B29, 0x005F00E9,
-		0x00600365, 0x006116C6,
-		0x00620786, 0x00630608,
-		0x00640788, 0x00650606,
-		0x00660046, 0x006718A8,
-		0x006858A6, 0x00690145,
-		0x006A01E9, 0x006B178A,
-		0x006C01E8, 0x006D1785,
-		0x006E1E28, 0x006F0C65,
-		0x00700CC5, 0x00711D5C,
-		0x00720648, 0x00730E28,
-		0x00740646, 0x00750E26,
-		0x00761B28, 0x007700E6,
-		0x007801E5, 0x00791786,
-		0x007A1E29, 0x007B0C68,
-		0x007C1E24, 0x007D0C69,
-		0x007E0955, 0x007F03C9,
-		0x008003E9, 0x00810975,
-		0x00820C49, 0x00831E04,
-		0x00840C48, 0x00851E05,
-		0x008617A6, 0x008701C5,
-		0x008800C6, 0x00891B08,
-		0x008A0E06, 0x008B0666,
-		0x008C0E08, 0x008D0668,
-		0x008E1D7C, 0x008F0CE5,
-		0x00900C45, 0x00911E08,
-		0x009217A9, 0x009301C4,
-		0x009417AA, 0x009501C9,
-		0x00960169, 0x0097588A,
-		0x00981888, 0x00990066,
-		0x009A0709, 0x009B07A8,
-		0x009C0704, 0x009D07A6,
-		0x009E16E6, 0x009F0345,
-		0x00A000C9, 0x00A11B05,
-		0x00A20E09, 0x00A30669,
-		0x00A41885, 0x00A50065,
-		0x00A60706, 0x00A707A5,
-		0x00A803A9, 0x00A90189,
-		0x00AA0029, 0x00AB0889,
-		0x00AC0744, 0x00AD06E9,
-		0x00AE0B06, 0x00AF0229,
-		0x00B00E05, 0x00B10665,
-		0x00B21974, 0x00B30CE8,
-		0x00B4070A, 0x00B507A9,
-		0x00B616E9, 0x00B70348,
-		0x00B8074A, 0x00B906E6,
-		0x00BA0B09, 0x00BB0226,
-		0x00BC1CE4, 0x00BD0D7D,
-		0x00BE0269, 0x00BF08C9,
-		0x00C000CA, 0x00C11B04,
-		0x00C21884, 0x00C3006A,
-		0x00C40E04, 0x00C50664,
-		0x00C60708, 0x00C707AA,
-		0x00C803A8, 0x00C90184,
-		0x00CA0749, 0x00CB06E4,
-		0x00CC0020, 0x00CD0888,
-		0x00CE0B08, 0x00CF0224,
-		0x00D00E0A, 0x00D1066A,
-		0x00D20705, 0x00D307A4,
-		0x00D41D78, 0x00D50CE9,
-		0x00D616EA, 0x00D70349,
-		0x00D80745, 0x00D906E8,
-		0x00DA1CE9, 0x00DB0D75,
-		0x00DC0B04, 0x00DD0228,
-		0x00DE0268, 0x00DF08C8,
-		0x00E003A5, 0x00E10185,
-		0x00E20746, 0x00E306EA,
-		0x00E40748, 0x00E506E5,
-		0x00E61CE8, 0x00E70D79,
-		0x00E81D74, 0x00E95CE6,
-		0x00EA02E9, 0x00EB0849,
-		0x00EC02E8, 0x00ED0848,
-		0x00EE0086, 0x00EF0A08,
-		0x00F00021, 0x00F10885,
-		0x00F20B05, 0x00F3022A,
-		0x00F40B0A, 0x00F50225,
-		0x00F60265, 0x00F708C5,
-		0x00F802E5, 0x00F90845,
-		0x00FA0089, 0x00FB0A09,
-		0x00FC008A, 0x00FD0A0A,
-		0x00FE02A9, 0x00FF0062,
-	};
-
-	if (!hbmMask)
-		return NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop), 0, 0);
-
-	/* 1. make mask bitmap's dc */
-	hDCMask = NtGdiCreateCompatibleDC(hdcDest);
-	hOldMaskBitmap = (HBITMAP)NtGdiSelectObject(hDCMask, hbmMask);
-
-	/* 2. make masked Background bitmap */
-
-	/* 2.1 make bitmap */
-	hDC1 = NtGdiCreateCompatibleDC(hdcDest);
-	hBitmap2 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight);
-	hOldBitmap2 = (HBITMAP)NtGdiSelectObject(hDC1, hBitmap2);
-
-	/* 2.2 draw dest bitmap and mask */
-	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY, 0, 0);
-	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, BKGND_ROP3(dwRop), 0, 0);
-	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, DSTERASE, 0, 0);
-
-	/* 3. make masked Foreground bitmap */
-
-	/* 3.1 make bitmap */
-	hDC2 = NtGdiCreateCompatibleDC(hdcDest);
-	hBitmap3 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight);
-	hOldBitmap3 = (HBITMAP)NtGdiSelectObject(hDC2, hBitmap3);
-
-	/* 3.2 draw src bitmap and mask */
-	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY, 0, 0);
-	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop), 0,0);
-	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, SRCAND, 0, 0);
-
-	/* 4. combine two bitmap and copy it to hdcDest */
-	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDC2, 0, 0, SRCPAINT, 0, 0);
-	NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hDC1, 0, 0, SRCCOPY, 0, 0);
-
-	/* 5. restore all object */
-	NtGdiSelectObject(hDCMask, hOldMaskBitmap);
-	NtGdiSelectObject(hDC1, hOldBitmap2);
-	NtGdiSelectObject(hDC2, hOldBitmap3);
-
-	/* 6. delete all temp object */
-	NtGdiDeleteObject(hBitmap2);
-	NtGdiDeleteObject(hBitmap3);
-
-	NtGdiDeleteObjectApp(hDC1);
-	NtGdiDeleteObjectApp(hDC2);
-	NtGdiDeleteObjectApp(hDCMask);
-
-	return TRUE;
-}
-
-BOOL
-APIENTRY
-NtGdiPlgBlt(
-    IN HDC hdcTrg,
-    IN LPPOINT pptlTrg,
-    IN HDC hdcSrc,
-    IN INT xSrc,
-    IN INT ySrc,
-    IN INT cxSrc,
-    IN INT cySrc,
-    IN HBITMAP hbmMask,
-    IN INT xMask,
-    IN INT yMask,
-    IN DWORD crBackColor)
-{
-	UNIMPLEMENTED;
-	return FALSE;
-}
-
 
 LONG STDCALL
 IntGetBitmapBits(
@@ -1148,379 +534,6 @@
 	NtGdiSelectObject(hDC, OldBrush);
 	NtGdiDeleteObject(NewBrush);
 	return TRUE;
-}
-
-BOOL STDCALL
-NtGdiStretchBlt(
-	HDC  hDCDest,
-	INT  XOriginDest,
-	INT  YOriginDest,
-	INT  WidthDest,
-	INT  HeightDest,
-	HDC  hDCSrc,
-	INT  XOriginSrc,
-	INT  YOriginSrc,
-	INT  WidthSrc,
-	INT  HeightSrc,
-	DWORD  ROP,
-	IN DWORD dwBackColor)
-{
-	PDC DCDest = NULL;
-	PDC DCSrc  = NULL;
-	BITMAPOBJ *BitmapDest, *BitmapSrc;
-	RECTL DestRect;
-	RECTL SourceRect;
-	BOOL Status;
-	XLATEOBJ *XlateObj = NULL;
-	HPALETTE SourcePalette = 0, DestPalette = 0;
-	PGDIBRUSHOBJ BrushObj;
-	BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000);
-	BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
-
-	if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc)
-	{
-		SetLastWin32Error(ERROR_INVALID_PARAMETER);
-		return FALSE;
-	}
-	DCDest = DC_LockDc(hDCDest);
-	if (NULL == DCDest)
-	{
-		DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\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 (UsesSource)
-	{
-		if (hDCSrc != hDCDest)
-		{
-			DCSrc = DC_LockDc(hDCSrc);
-			if (NULL == DCSrc)
-			{
-				DC_UnlockDc(DCDest);
-				DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiStretchBlt\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;
-		}
-	}
-	else
-	{
-		DCSrc = NULL;
-	}
-
-	/* Offset the destination and source by the origin of their DCs. */
-	XOriginDest += DCDest->w.DCOrgX;
-	YOriginDest += DCDest->w.DCOrgY;
-	if (UsesSource)
-	{
-		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 (UsesSource)
-	{
-		if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
-			BitmapSrc = BitmapDest;
-		else
-			BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
-	}
-	else
-	{
-		BitmapSrc = NULL;
-	}
-
-	if ( UsesSource )
-	{
-		int sw = BitmapSrc->SurfObj.sizlBitmap.cx;
-		int sh = BitmapSrc->SurfObj.sizlBitmap.cy;
-		if ( SourceRect.left < 0 )
-		{
-			DestRect.left = DestRect.right - (DestRect.right-DestRect.left) * (SourceRect.right)/abs(SourceRect.right-SourceRect.left);
-			SourceRect.left = 0;
-		}
-		if ( SourceRect.top < 0 )
-		{
-			DestRect.top = DestRect.bottom - (DestRect.bottom-DestRect.top) * (SourceRect.bottom)/abs(SourceRect.bottom-SourceRect.top);
-			SourceRect.top = 0;
-		}
-		if ( SourceRect.right < -1 )
-		{
-			DestRect.right = DestRect.left + (DestRect.right-DestRect.left) * (-1-SourceRect.left)/abs(SourceRect.right-SourceRect.left);
-			SourceRect.right = -1;
-		}
-		if ( SourceRect.bottom < -1 )
-		{
-			DestRect.bottom = DestRect.top + (DestRect.bottom-DestRect.top) * (-1-SourceRect.top)/abs(SourceRect.bottom-SourceRect.top);
-			SourceRect.bottom = -1;
-		}
-		if ( SourceRect.right > sw )
-		{
-			DestRect.right = DestRect.left + (DestRect.right-DestRect.left) * abs(sw-SourceRect.left) / abs(SourceRect.right-SourceRect.left);
-			SourceRect.right = sw;
-		}
-		if ( SourceRect.bottom > sh )
-		{
-			DestRect.bottom = DestRect.top + (DestRect.bottom-DestRect.top) * abs(sh-SourceRect.top) / abs(SourceRect.bottom-SourceRect.top);
-			SourceRect.bottom = sh;
-		}
-		sw--;
-		sh--;
-		if ( SourceRect.left > sw )
-		{
-			DestRect.left = DestRect.right - (DestRect.right-DestRect.left) * (SourceRect.right-sw) / abs(SourceRect.right-SourceRect.left);
-			SourceRect.left = 0;
-		}
-		if ( SourceRect.top > sh )
-		{
-			DestRect.top = DestRect.bottom - (DestRect.bottom-DestRect.top) * (SourceRect.bottom-sh) / abs(SourceRect.bottom-SourceRect.top);
-			SourceRect.top = 0;
-		}
-		if (0 == (DestRect.right-DestRect.left) || 0 == (DestRect.bottom-DestRect.top) || 0 == (SourceRect.right-SourceRect.left) || 0 == (SourceRect.bottom-SourceRect.top))
-		{
-			SetLastWin32Error(ERROR_INVALID_PARAMETER);
-			Status = FALSE;
-			goto failed;
-		}
-	}
-
-	if (UsesPattern)
-	{
-		BrushObj = BRUSHOBJ_LockBrush(DCDest->Dc_Attr.hbrush);
-		if (NULL == BrushObj)
-		{
-			if (UsesSource && hDCSrc != hDCDest)
-			{
-				DC_UnlockDc(DCSrc);
-			}
-			DC_UnlockDc(DCDest);
-			SetLastWin32Error(ERROR_INVALID_HANDLE);
-			return FALSE;
-		}
-	}
-	else
-	{
-		BrushObj = NULL;
-	}
-
-	/* Create the XLATEOBJ. */
-	if (UsesSource)
-	{
-		if (DCDest->w.hPalette != 0)
-			DestPalette = DCDest->w.hPalette;
-
-		if (DCSrc->w.hPalette != 0)
-			SourcePalette = DCSrc->w.hPalette;
-
-		/* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */
-		XlateObj = (XLATEOBJ*)IntEngCreateXlate(0, 0, DestPalette, SourcePalette);
-		if (NULL == XlateObj)
-		{
-			if (UsesSource && hDCSrc != hDCDest)
-			{
-				DC_UnlockDc(DCSrc);
-			}
-			DC_UnlockDc(DCDest);
-			SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
-			return FALSE;
-		}
-	}
-
-	/* Perform the bitblt operation */
-	Status = IntEngStretchBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
-                                  NULL, DCDest->CombinedClip, XlateObj,
-                                  &DestRect, &SourceRect, NULL, NULL, NULL,
-                                  COLORONCOLOR);
-
-	if (UsesSource)
-		EngDeleteXlate(XlateObj);
-	if (UsesPattern)
-	{
-		BRUSHOBJ_UnlockBrush(BrushObj);
-	}
-failed:
-	if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap)
-	{
-		BITMAPOBJ_UnlockBitmap(BitmapSrc);
-	}
-	BITMAPOBJ_UnlockBitmap(BitmapDest);
-	if (UsesSource && hDCSrc != hDCDest)
-	{
-		DC_UnlockDc(DCSrc);
-	}
-	DC_UnlockDc(DCDest);
-
-	return Status;
-}
-
-BOOL STDCALL
-NtGdiAlphaBlend(
-	HDC  hDCDest,
-	LONG  XOriginDest,
-	LONG  YOriginDest,
-	LONG  WidthDest,
-	LONG  HeightDest,
-	HDC  hDCSrc,
-	LONG  XOriginSrc,
-	LONG  YOriginSrc,
-	LONG  WidthSrc,
-	LONG  HeightSrc,
-	BLENDFUNCTION  BlendFunc,
-	HANDLE hcmXform)
-{
-	PDC DCDest = NULL;
-	PDC DCSrc  = NULL;
-	BITMAPOBJ *BitmapDest, *BitmapSrc;
-	RECTL DestRect, SourceRect;
-	BOOL Status;
-	XLATEOBJ *XlateObj;
-	BLENDOBJ BlendObj;
-	HPALETTE SourcePalette = 0, DestPalette = 0;
-	BlendObj.BlendFunction = BlendFunc;
-
-	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 NtGdiAlphaBlend\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->Dc_Attr.crBackgroundClr);
-		}
-		else if (DCSrc->w.bitsPerPixel == 1)
-		{
-			XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->Dc_Attr.crBackgroundClr, DCSrc->Dc_Attr.crForegroundClr);
-		}
-		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  */

Added: trunk/reactos/subsystems/win32/win32k/objects/painting.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/painting.c?rev=28302&view=auto
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/painting.c (added)
+++ trunk/reactos/subsystems/win32/win32k/objects/painting.c Sun Aug 12 20:20:29 2007
@@ -1,0 +1,1014 @@
+/*
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id: bitmaps.c 28300 2007-08-12 15:20:09Z tkreuzer $ */
+
+#include <w32k.h>
+
+#define NDEBUG
+#include <debug.h>
+
+
+
+BOOL STDCALL
+NtGdiAlphaBlend(
+	HDC  hDCDest,
+	LONG  XOriginDest,
+	LONG  YOriginDest,
+	LONG  WidthDest,
+	LONG  HeightDest,
+	HDC  hDCSrc,
+	LONG  XOriginSrc,
+	LONG  YOriginSrc,
+	LONG  WidthSrc,
+	LONG  HeightSrc,
+	BLENDFUNCTION  BlendFunc,
+	HANDLE hcmXform)
+{
+	PDC DCDest = NULL;
+	PDC DCSrc  = NULL;
+	BITMAPOBJ *BitmapDest, *BitmapSrc;
+	RECTL DestRect, SourceRect;
+	BOOL Status;
+	XLATEOBJ *XlateObj;
+	BLENDOBJ BlendObj;
+	HPALETTE SourcePalette = 0, DestPalette = 0;
+	BlendObj.BlendFunction = BlendFunc;
+
+	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 NtGdiAlphaBlend\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->Dc_Attr.crBackgroundClr);
+		}
+		else if (DCSrc->w.bitsPerPixel == 1)
+		{
+			XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->Dc_Attr.crBackgroundClr, DCSrc->Dc_Attr.crForegroundClr);
+		}
+		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;
+}
+
+BOOL STDCALL
+NtGdiBitBlt(
+	HDC  hDCDest,
+	INT  XDest,
+	INT  YDest,
+	INT  Width,
+	INT  Height,
+	HDC  hDCSrc,
+	INT  XSrc,
+	INT  YSrc,
+	DWORD  ROP,
+	IN DWORD crBackColor,
+	IN FLONG fl)
+{
+	PDC DCDest = NULL;
+	PDC DCSrc  = NULL;
+	BITMAPOBJ *BitmapDest, *BitmapSrc;
+	RECTL DestRect;
+	POINTL SourcePoint, BrushOrigin;
+	BOOL Status;
+	XLATEOBJ *XlateObj = NULL;
+	HPALETTE SourcePalette = 0, DestPalette = 0;
+	PGDIBRUSHOBJ BrushObj;
+	GDIBRUSHINST BrushInst;
+	BOOL UsesSource = ROP3_USES_SOURCE(ROP);
+	BOOL UsesPattern = ROP3_USES_PATTERN(ROP);
+
+	DCDest = DC_LockDc(hDCDest);
+	if (NULL == DCDest)
+	{
+		DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\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 (UsesSource)
+	{
+		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;
+		}
+	}
+	else
+	{
+		DCSrc = NULL;
+	}
+
+	/* Offset the destination and source by the origin of their DCs. */
+	XDest += DCDest->w.DCOrgX;
+	YDest += DCDest->w.DCOrgY;
+	if (UsesSource)
+	{
+		XSrc += DCSrc->w.DCOrgX;
+		YSrc += DCSrc->w.DCOrgY;
+	}
+
+	DestRect.left   = XDest;
+	DestRect.top    = YDest;
+	DestRect.right  = XDest+Width;
+	DestRect.bottom = YDest+Height;
+
+	IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2);
+
+	SourcePoint.x = XSrc;
+	SourcePoint.y = YSrc;
+
+	BrushOrigin.x = 0;
+	BrushOrigin.y = 0;
+
+	/* Determine surfaces to be used in the bitblt */
+	BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
+	if (UsesSource)
+	{
+		if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
+			BitmapSrc = BitmapDest;
+		else
+			BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
+	}
+	else
+	{
+		BitmapSrc = NULL;
+	}
+
+	if (UsesPattern)
+	{
+		BrushObj = BRUSHOBJ_LockBrush(DCDest->Dc_Attr.hbrush);
+		if (NULL == BrushObj)
+		{
+			if (UsesSource && hDCSrc != hDCDest)
+			{
+				DC_UnlockDc(DCSrc);
+			}
+			if(BitmapDest != NULL)
+			{
+				BITMAPOBJ_UnlockBitmap(BitmapDest);
+			}
+			if(BitmapSrc != NULL && BitmapSrc != BitmapDest)
+			{
+				BITMAPOBJ_UnlockBitmap(BitmapSrc);
+			}
+			DC_UnlockDc(DCDest);
+			SetLastWin32Error(ERROR_INVALID_HANDLE);
+			return FALSE;
+		}
+		BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin);
+		IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush);
+	}
+	else
+	{
+		BrushObj = NULL;
+	}
+
+	/* Create the XLATEOBJ. */
+	if (UsesSource)
+	{
+		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->Dc_Attr.crBackgroundClr);
+			}
+			else if (DCSrc->w.bitsPerPixel == 1)
+			{
+				XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->Dc_Attr.crBackgroundClr, DCSrc->Dc_Attr.crForegroundClr);
+			}
+			else
+			{
+				XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette);
+			}
+			if (NULL == XlateObj)
+			{
+				if (UsesSource && hDCSrc != hDCDest)
+				{
+					DC_UnlockDc(DCSrc);
+				}
+				DC_UnlockDc(DCDest);
+				if(BitmapDest != NULL)
+				{
+					BITMAPOBJ_UnlockBitmap(BitmapDest);
+				}
+				if(BitmapSrc != NULL && BitmapSrc != BitmapDest)
+				{
+					BITMAPOBJ_UnlockBitmap(BitmapSrc);
+				}
+				if(BrushObj != NULL)
+				{
+					BRUSHOBJ_UnlockBrush(BrushObj);
+				}
+				SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+				return FALSE;
+			}
+		}
+	}
+
+	/* Perform the bitblt operation */
+	Status = IntEngBitBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, NULL,
+                          DCDest->CombinedClip, XlateObj, &DestRect,
+                          &SourcePoint, NULL,
+                          BrushObj ? &BrushInst.BrushObject : NULL,
+                          &BrushOrigin, ROP3_TO_ROP4(ROP));
+
+	if (UsesSource && XlateObj != NULL)
+		EngDeleteXlate(XlateObj);
+
+	if(BitmapDest != NULL)
+	{
+		BITMAPOBJ_UnlockBitmap(BitmapDest);
+	}
+	if (UsesSource && BitmapSrc != BitmapDest)
+	{
+		BITMAPOBJ_UnlockBitmap(BitmapSrc);
+	}
+	if (BrushObj != NULL)
+	{
+		BRUSHOBJ_UnlockBrush(BrushObj);
+	}
+	if (UsesSource && hDCSrc != hDCDest)
+	{
+		DC_UnlockDc(DCSrc);
+	}
+	DC_UnlockDc(DCDest);
+
+	return Status;
+}
+
+BOOL STDCALL
+NtGdiTransparentBlt(
+	HDC			hdcDst,
+	INT			xDst,
+	INT			yDst,
+	INT			cxDst,
+	INT			cyDst,
+	HDC			hdcSrc,
+	INT			xSrc,
+	INT			ySrc,
+	INT			cxSrc,
+	INT			cySrc,
+	COLORREF	TransColor)
+{
+  PDC DCDest, DCSrc;
+  RECTL rcDest, rcSrc;
+  BITMAPOBJ *BitmapDest, *BitmapSrc;
+  XLATEOBJ *XlateObj;
+  HPALETTE SourcePalette = 0, DestPalette = 0;
+  PPALGDI PalDestGDI, PalSourceGDI;
+  USHORT PalDestMode, PalSrcMode;
+  ULONG TransparentColor = 0;
+  BOOL Ret = FALSE;
+
+  if(!(DCDest = DC_LockDc(hdcDst)))
+  {
+    DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcDst);
+    SetLastWin32Error(ERROR_INVALID_HANDLE);
+    return FALSE;
+  }
+  if (DCDest->IsIC)
+  {
+    DC_UnlockDc(DCDest);
+    /* Yes, Windows really returns TRUE in this case */
+    return TRUE;
+  }
+
+  if((hdcDst != hdcSrc) && !(DCSrc = DC_LockDc(hdcSrc)))
+  {
+    DC_UnlockDc(DCDest);
+    DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcSrc);
+    SetLastWin32Error(ERROR_INVALID_HANDLE);
+    return FALSE;
+  }
+  if(hdcDst == hdcSrc)
+  {
+    DCSrc = DCDest;
+  }
+  if (DCSrc->IsIC)
+  {
+    DC_UnlockDc(DCSrc);
+    if(hdcDst != hdcSrc)
+    {
+      DC_UnlockDc(DCDest);
+    }
+    /* Yes, Windows really returns TRUE in this case */
+    return TRUE;
+  }
+
+  /* Offset positions */
+  xDst += DCDest->w.DCOrgX;
+  yDst += DCDest->w.DCOrgY;
+  xSrc += DCSrc->w.DCOrgX;
+  ySrc += DCSrc->w.DCOrgY;
+
+  if(DCDest->w.hPalette)
+    DestPalette = DCDest->w.hPalette;
+
+  if(DCSrc->w.hPalette)
+    SourcePalette = DCSrc->w.hPalette;
+
+  if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette)))
+  {
+    DC_UnlockDc(DCSrc);
+    DC_UnlockDc(DCDest);
+    SetLastWin32Error(ERROR_INVALID_HANDLE);
+    return FALSE;
+  }
+  if((DestPalette != SourcePalette) && !(PalDestGDI = PALETTE_LockPalette(DestPalette)))
+  {
+    PALETTE_UnlockPalette(PalSourceGDI);
+    DC_UnlockDc(DCSrc);
+    DC_UnlockDc(DCDest);
+    SetLastWin32Error(ERROR_INVALID_HANDLE);
+    return FALSE;
+  }
+  if(DestPalette != SourcePalette)
+  {
+    PalDestMode = PalDestGDI->Mode;
+    PalSrcMode = PalSourceGDI->Mode;
+    PALETTE_UnlockPalette(PalDestGDI);
+  }
+  else
+  {
+    PalDestMode = PalSrcMode = PalSourceGDI->Mode;
+  }
+  PALETTE_UnlockPalette(PalSourceGDI);
+
+  /* Translate Transparent (RGB) Color to the source palette */
+  if((XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL)))
+  {
+    TransparentColor = XLATEOBJ_iXlate(XlateObj, (ULONG)TransColor);
+    EngDeleteXlate(XlateObj);
+  }
+
+  /* Create the XLATE object to convert colors between source and destination */
+  XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette);
+
+  BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
+  /* FIXME - BitmapDest can be NULL!!!! Don't assert here! */
+  ASSERT(BitmapDest);
+  BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
+  /* FIXME - BitmapSrc can be NULL!!!! Don't assert here! */
+  ASSERT(BitmapSrc);
+
+  rcDest.left = xDst;
+  rcDest.top = yDst;
+  rcDest.right = rcDest.left + cxDst;
+  rcDest.bottom = rcDest.top + cyDst;
+  rcSrc.left = xSrc;
+  rcSrc.top = ySrc;
+  rcSrc.right = rcSrc.left + cxSrc;
+  rcSrc.bottom = rcSrc.top + cySrc;
+
+  if((cxDst != cxSrc) || (cyDst != cySrc))
+  {
+    DPRINT1("TransparentBlt() does not support stretching at the moment!\n");
+    goto done;
+  }
+
+  Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
+                             DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc,
+                             TransparentColor, 0);
+
+done:
+  BITMAPOBJ_UnlockBitmap(BitmapDest);
+  BITMAPOBJ_UnlockBitmap(BitmapSrc);
+  DC_UnlockDc(DCSrc);
+  if(hdcDst != hdcSrc)
+  {
+    DC_UnlockDc(DCDest);
+  }
+  if(XlateObj)
+  {
+    EngDeleteXlate(XlateObj);
+  }
+  return Ret;
+}
+
+BOOL STDCALL
+NtGdiExtFloodFill(
+	HDC  hDC,
+	INT  XStart,
+	INT  YStart,
+	COLORREF  Color,
+	UINT  FillType)
+{
+	DPRINT1("FIXME: NtGdiExtFloodFill is UNIMPLEMENTED\n");
+
+	/* lie and say we succeded */
+	return TRUE;
+}
+
+/***********************************************************************
+ * MaskBlt
+ * Ported from WINE by sedwards 11-4-03
+ *
+ * Someone thought it would be faster to do it here and then switch back
+ * to GDI32. I dunno. Write a test and let me know.
+ */
+
+static __inline BYTE
+SwapROP3_SrcDst(BYTE bRop3)
+{
+	return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1);
+}
+
+#define FRGND_ROP3(ROP4)	((ROP4) & 0x00FFFFFF)
+#define BKGND_ROP3(ROP4)	(ROP3Table[(SwapROP3_SrcDst((ROP4)>>24)) & 0xFF])
+#define DSTCOPY 		0x00AA0029
+#define DSTERASE		0x00220326 /* dest = dest & (~src) : DSna */
+
+BOOL STDCALL
+NtGdiMaskBlt (
+	HDC hdcDest, INT nXDest, INT nYDest,
+	INT nWidth, INT nHeight, HDC hdcSrc,
+	INT nXSrc, INT nYSrc, HBITMAP hbmMask,
+	INT xMask, INT yMask, DWORD dwRop,
+	IN DWORD crBackColor)
+{
+	HBITMAP hOldMaskBitmap, hBitmap2, hOldBitmap2, hBitmap3, hOldBitmap3;
+	HDC hDCMask, hDC1, hDC2;
+	static const DWORD ROP3Table[256] =
+	{
+		0x00000042, 0x00010289,
+		0x00020C89, 0x000300AA,
+		0x00040C88, 0x000500A9,
+		0x00060865, 0x000702C5,
+		0x00080F08, 0x00090245,
+		0x000A0329, 0x000B0B2A,
+		0x000C0324, 0x000D0B25,
+		0x000E08A5, 0x000F0001,
+		0x00100C85, 0x001100A6,
+		0x00120868, 0x001302C8,
+		0x00140869, 0x001502C9,
+		0x00165CCA, 0x00171D54,
+		0x00180D59, 0x00191CC8,
+		0x001A06C5, 0x001B0768,
+		0x001C06CA, 0x001D0766,
+		0x001E01A5, 0x001F0385,
+		0x00200F09, 0x00210248,
+		0x00220326, 0x00230B24,
+		0x00240D55, 0x00251CC5,
+		0x002606C8, 0x00271868,
+		0x00280369, 0x002916CA,
+		0x002A0CC9, 0x002B1D58,
+		0x002C0784, 0x002D060A,
+		0x002E064A, 0x002F0E2A,
+		0x0030032A, 0x00310B28,
+		0x00320688, 0x00330008,
+		0x003406C4, 0x00351864,
+		0x003601A8, 0x00370388,
+		0x0038078A, 0x00390604,
+		0x003A0644, 0x003B0E24,
+		0x003C004A, 0x003D18A4,
+		0x003E1B24, 0x003F00EA,
+		0x00400F0A, 0x00410249,
+		0x00420D5D, 0x00431CC4,
+		0x00440328, 0x00450B29,
+		0x004606C6, 0x0047076A,
+		0x00480368, 0x004916C5,
+		0x004A0789, 0x004B0605,
+		0x004C0CC8, 0x004D1954,
+		0x004E0645, 0x004F0E25,
+		0x00500325, 0x00510B26,
+		0x005206C9, 0x00530764,
+		0x005408A9, 0x00550009,
+		0x005601A9, 0x00570389,
+		0x00580785, 0x00590609,
+		0x005A0049, 0x005B18A9,
+		0x005C0649, 0x005D0E29,
+		0x005E1B29, 0x005F00E9,
+		0x00600365, 0x006116C6,
+		0x00620786, 0x00630608,
+		0x00640788, 0x00650606,
+		0x00660046, 0x006718A8,
+		0x006858A6, 0x00690145,
+		0x006A01E9, 0x006B178A,
+		0x006C01E8, 0x006D1785,
+		0x006E1E28, 0x006F0C65,
+		0x00700CC5, 0x00711D5C,
+		0x00720648, 0x00730E28,
+		0x00740646, 0x00750E26,
+		0x00761B28, 0x007700E6,
+		0x007801E5, 0x00791786,
+		0x007A1E29, 0x007B0C68,
+		0x007C1E24, 0x007D0C69,
+		0x007E0955, 0x007F03C9,
+		0x008003E9, 0x00810975,
+		0x00820C49, 0x00831E04,
+		0x00840C48, 0x00851E05,
+		0x008617A6, 0x008701C5,
+		0x008800C6, 0x00891B08,
+		0x008A0E06, 0x008B0666,
+		0x008C0E08, 0x008D0668,
+		0x008E1D7C, 0x008F0CE5,
+		0x00900C45, 0x00911E08,
+		0x009217A9, 0x009301C4,
+		0x009417AA, 0x009501C9,
+		0x00960169, 0x0097588A,
+		0x00981888, 0x00990066,
+		0x009A0709, 0x009B07A8,
+		0x009C0704, 0x009D07A6,
+		0x009E16E6, 0x009F0345,
+		0x00A000C9, 0x00A11B05,
+		0x00A20E09, 0x00A30669,
+		0x00A41885, 0x00A50065,
+		0x00A60706, 0x00A707A5,
+		0x00A803A9, 0x00A90189,
+		0x00AA0029, 0x00AB0889,
+		0x00AC0744, 0x00AD06E9,
+		0x00AE0B06, 0x00AF0229,
+		0x00B00E05, 0x00B10665,
+		0x00B21974, 0x00B30CE8,
+		0x00B4070A, 0x00B507A9,
+		0x00B616E9, 0x00B70348,
+		0x00B8074A, 0x00B906E6,
+		0x00BA0B09, 0x00BB0226,
+		0x00BC1CE4, 0x00BD0D7D,
+		0x00BE0269, 0x00BF08C9,
+		0x00C000CA, 0x00C11B04,
+		0x00C21884, 0x00C3006A,
+		0x00C40E04, 0x00C50664,
+		0x00C60708, 0x00C707AA,
+		0x00C803A8, 0x00C90184,
+		0x00CA0749, 0x00CB06E4,
+		0x00CC0020, 0x00CD0888,
+		0x00CE0B08, 0x00CF0224,
+		0x00D00E0A, 0x00D1066A,
+		0x00D20705, 0x00D307A4,
+		0x00D41D78, 0x00D50CE9,
+		0x00D616EA, 0x00D70349,
+		0x00D80745, 0x00D906E8,
+		0x00DA1CE9, 0x00DB0D75,
+		0x00DC0B04, 0x00DD0228,
+		0x00DE0268, 0x00DF08C8,
+		0x00E003A5, 0x00E10185,
+		0x00E20746, 0x00E306EA,
+		0x00E40748, 0x00E506E5,
+		0x00E61CE8, 0x00E70D79,
+		0x00E81D74, 0x00E95CE6,
+		0x00EA02E9, 0x00EB0849,
+		0x00EC02E8, 0x00ED0848,
+		0x00EE0086, 0x00EF0A08,
+		0x00F00021, 0x00F10885,
+		0x00F20B05, 0x00F3022A,
+		0x00F40B0A, 0x00F50225,
+		0x00F60265, 0x00F708C5,
+		0x00F802E5, 0x00F90845,
+		0x00FA0089, 0x00FB0A09,
+		0x00FC008A, 0x00FD0A0A,
+		0x00FE02A9, 0x00FF0062,
+	};
+
+	if (!hbmMask)
+		return NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop), 0, 0);
+
+	/* 1. make mask bitmap's dc */
+	hDCMask = NtGdiCreateCompatibleDC(hdcDest);
+	hOldMaskBitmap = (HBITMAP)NtGdiSelectObject(hDCMask, hbmMask);
+
+	/* 2. make masked Background bitmap */
+
+	/* 2.1 make bitmap */
+	hDC1 = NtGdiCreateCompatibleDC(hdcDest);
+	hBitmap2 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight);
+	hOldBitmap2 = (HBITMAP)NtGdiSelectObject(hDC1, hBitmap2);
+
+	/* 2.2 draw dest bitmap and mask */
+	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY, 0, 0);
+	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, BKGND_ROP3(dwRop), 0, 0);
+	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, DSTERASE, 0, 0);
+
+	/* 3. make masked Foreground bitmap */
+
+	/* 3.1 make bitmap */
+	hDC2 = NtGdiCreateCompatibleDC(hdcDest);
+	hBitmap3 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight);
+	hOldBitmap3 = (HBITMAP)NtGdiSelectObject(hDC2, hBitmap3);
+
+	/* 3.2 draw src bitmap and mask */
+	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY, 0, 0);
+	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop), 0,0);
+	NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, SRCAND, 0, 0);
+
+	/* 4. combine two bitmap and copy it to hdcDest */
+	NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDC2, 0, 0, SRCPAINT, 0, 0);
+	NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hDC1, 0, 0, SRCCOPY, 0, 0);
+
+	/* 5. restore all object */
+	NtGdiSelectObject(hDCMask, hOldMaskBitmap);
+	NtGdiSelectObject(hDC1, hOldBitmap2);
+	NtGdiSelectObject(hDC2, hOldBitmap3);
+
+	/* 6. delete all temp object */
+	NtGdiDeleteObject(hBitmap2);
+	NtGdiDeleteObject(hBitmap3);
+
+	NtGdiDeleteObjectApp(hDC1);
+	NtGdiDeleteObjectApp(hDC2);
+	NtGdiDeleteObjectApp(hDCMask);
+
+	return TRUE;
+}
+
+BOOL
+APIENTRY
+NtGdiPlgBlt(
+    IN HDC hdcTrg,
+    IN LPPOINT pptlTrg,
+    IN HDC hdcSrc,
+    IN INT xSrc,
+    IN INT ySrc,
+    IN INT cxSrc,
+    IN INT cySrc,
+    IN HBITMAP hbmMask,
+    IN INT xMask,
+    IN INT yMask,
+    IN DWORD crBackColor)
+{
+	UNIMPLEMENTED;
+	return FALSE;
+}
+
+BOOL STDCALL
+NtGdiStretchBlt(
+	HDC  hDCDest,
+	INT  XOriginDest,
+	INT  YOriginDest,
+	INT  WidthDest,
+	INT  HeightDest,
+	HDC  hDCSrc,
+	INT  XOriginSrc,
+	INT  YOriginSrc,
+	INT  WidthSrc,
+	INT  HeightSrc,
+	DWORD  ROP,
+	IN DWORD dwBackColor)
+{
+	PDC DCDest = NULL;
+	PDC DCSrc  = NULL;
+	BITMAPOBJ *BitmapDest, *BitmapSrc;
+	RECTL DestRect;
+	RECTL SourceRect;
+	BOOL Status;
+	XLATEOBJ *XlateObj = NULL;
+	HPALETTE SourcePalette = 0, DestPalette = 0;
+	PGDIBRUSHOBJ BrushObj;
+	BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000);
+	BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
+
+	if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc)
+	{
+		SetLastWin32Error(ERROR_INVALID_PARAMETER);
+		return FALSE;
+	}
+	DCDest = DC_LockDc(hDCDest);
+	if (NULL == DCDest)
+	{
+		DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\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 (UsesSource)
+	{
+		if (hDCSrc != hDCDest)
+		{
+			DCSrc = DC_LockDc(hDCSrc);
+			if (NULL == DCSrc)
+			{
+				DC_UnlockDc(DCDest);
+				DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiStretchBlt\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;
+		}
+	}
+	else
+	{
+		DCSrc = NULL;
+	}
+
+	/* Offset the destination and source by the origin of their DCs. */
+	XOriginDest += DCDest->w.DCOrgX;
+	YOriginDest += DCDest->w.DCOrgY;
+	if (UsesSource)
+	{
+		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 (UsesSource)
+	{
+		if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
+			BitmapSrc = BitmapDest;
+		else
+			BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
+	}
+	else
+	{
+		BitmapSrc = NULL;
+	}
+
+	if ( UsesSource )
+	{
+		int sw = BitmapSrc->SurfObj.sizlBitmap.cx;
+		int sh = BitmapSrc->SurfObj.sizlBitmap.cy;
+		if ( SourceRect.left < 0 )
+		{
+			DestRect.left = DestRect.right - (DestRect.right-DestRect.left) * (SourceRect.right)/abs(SourceRect.right-SourceRect.left);
+			SourceRect.left = 0;
+		}
+		if ( SourceRect.top < 0 )
+		{
+			DestRect.top = DestRect.bottom - (DestRect.bottom-DestRect.top) * (SourceRect.bottom)/abs(SourceRect.bottom-SourceRect.top);
+			SourceRect.top = 0;
+		}
+		if ( SourceRect.right < -1 )
+		{
+			DestRect.right = DestRect.left + (DestRect.right-DestRect.left) * (-1-SourceRect.left)/abs(SourceRect.right-SourceRect.left);
+			SourceRect.right = -1;
+		}
+		if ( SourceRect.bottom < -1 )
+		{
+			DestRect.bottom = DestRect.top + (DestRect.bottom-DestRect.top) * (-1-SourceRect.top)/abs(SourceRect.bottom-SourceRect.top);
+			SourceRect.bottom = -1;
+		}
+		if ( SourceRect.right > sw )
+		{
+			DestRect.right = DestRect.left + (DestRect.right-DestRect.left) * abs(sw-SourceRect.left) / abs(SourceRect.right-SourceRect.left);
+			SourceRect.right = sw;
+		}
+		if ( SourceRect.bottom > sh )
+		{
+			DestRect.bottom = DestRect.top + (DestRect.bottom-DestRect.top) * abs(sh-SourceRect.top) / abs(SourceRect.bottom-SourceRect.top);
+			SourceRect.bottom = sh;
+		}
+		sw--;
+		sh--;
+		if ( SourceRect.left > sw )
+		{
+			DestRect.left = DestRect.right - (DestRect.right-DestRect.left) * (SourceRect.right-sw) / abs(SourceRect.right-SourceRect.left);
+			SourceRect.left = 0;
+		}
+		if ( SourceRect.top > sh )
+		{
+			DestRect.top = DestRect.bottom - (DestRect.bottom-DestRect.top) * (SourceRect.bottom-sh) / abs(SourceRect.bottom-SourceRect.top);
+			SourceRect.top = 0;
+		}
+		if (0 == (DestRect.right-DestRect.left) || 0 == (DestRect.bottom-DestRect.top) || 0 == (SourceRect.right-SourceRect.left) || 0 == (SourceRect.bottom-SourceRect.top))
+		{
+			SetLastWin32Error(ERROR_INVALID_PARAMETER);
+			Status = FALSE;
+			goto failed;
+		}
+	}
+
+	if (UsesPattern)
+	{
+		BrushObj = BRUSHOBJ_LockBrush(DCDest->Dc_Attr.hbrush);
+		if (NULL == BrushObj)
+		{
+			if (UsesSource && hDCSrc != hDCDest)
+			{
+				DC_UnlockDc(DCSrc);
+			}
+			DC_UnlockDc(DCDest);
+			SetLastWin32Error(ERROR_INVALID_HANDLE);
+			return FALSE;
+		}
+	}
+	else
+	{
+		BrushObj = NULL;
+	}
+
+	/* Create the XLATEOBJ. */
+	if (UsesSource)
+	{
+		if (DCDest->w.hPalette != 0)
+			DestPalette = DCDest->w.hPalette;
+
+		if (DCSrc->w.hPalette != 0)
+			SourcePalette = DCSrc->w.hPalette;
+
+		/* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */
+		XlateObj = (XLATEOBJ*)IntEngCreateXlate(0, 0, DestPalette, SourcePalette);
+		if (NULL == XlateObj)
+		{
+			if (UsesSource && hDCSrc != hDCDest)
+			{
+				DC_UnlockDc(DCSrc);
+			}
+			DC_UnlockDc(DCDest);
+			SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+			return FALSE;
+		}
+	}
+
+	/* Perform the bitblt operation */
+	Status = IntEngStretchBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
+                                  NULL, DCDest->CombinedClip, XlateObj,
+                                  &DestRect, &SourceRect, NULL, NULL, NULL,
+                                  COLORONCOLOR);
+
+	if (UsesSource)
+		EngDeleteXlate(XlateObj);
+	if (UsesPattern)
+	{
+		BRUSHOBJ_UnlockBrush(BrushObj);
+	}
+failed:
+	if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap)
+	{
+		BITMAPOBJ_UnlockBitmap(BitmapSrc);
+	}
+	BITMAPOBJ_UnlockBitmap(BitmapDest);
+	if (UsesSource && hDCSrc != hDCDest)
+	{
+		DC_UnlockDc(DCSrc);
+	}
+	DC_UnlockDc(DCDest);
+
+	return Status;
+}
+

Modified: trunk/reactos/subsystems/win32/win32k/win32k.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/win32k.rbuild?rev=28302&r1=28301&r2=28302&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/win32k.rbuild (original)
+++ trunk/reactos/subsystems/win32/win32k/win32k.rbuild Sun Aug 12 20:20:29 2007
@@ -146,6 +146,7 @@
 		<file>icm.c</file>
 		<file>line.c</file>
 		<file>metafile.c</file>
+		<file>painting.c</file>
 		<file>paintobj.c</file>
 		<file>palobj.c</file>
 		<file>path.c</file>




More information about the Ros-diffs mailing list