Author: jgardou
Date: Sat Apr 17 16:46:05 2010
New Revision: 46905
URL:
http://svn.reactos.org/svn/reactos?rev=46905&view=rev
Log:
[WIN32K]
-Use GDIOBJ_LockMultipleObjs, DC_vPrepareDCsForBlit and DC_vFinishBlit in
NtGdiTransparentBlt
-Get rid of MouseSafetyOnDraw{End,Start} in IntEngTransparentBlt
Modified:
branches/reactos-yarotows/subsystems/win32/win32k/eng/transblt.c
branches/reactos-yarotows/subsystems/win32/win32k/objects/bitblt.c
Modified: branches/reactos-yarotows/subsystems/win32/win32k/eng/transblt.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/eng/transblt.c [iso-8859-1]
(original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/eng/transblt.c [iso-8859-1] Sat Apr
17 16:46:05 2010
@@ -76,7 +76,7 @@
OutputRect.top = DestRect->bottom;
OutputRect.bottom = DestRect->top;
}
-
+
if(Clip)
{
if(OutputRect.left < Clip->rclBounds.left)
@@ -287,12 +287,8 @@
if(psoSource != psoDest)
{
SURFACE_LockBitmapBits(psurfSource);
- MouseSafetyOnDrawStart(psoSource, InputRect.left, InputRect.top,
- InputRect.right, InputRect.bottom);
}
SURFACE_LockBitmapBits(psurfDest);
- MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
- OutputRect.right, OutputRect.bottom);
if(psurfDest->flHooks & HOOK_TRANSPARENTBLT)
{
@@ -309,11 +305,9 @@
&OutputRect, &InputRect, iTransColor, Reserved);
}
- MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
if(psoSource != psoDest)
{
- MouseSafetyOnDrawEnd(psoSource);
SURFACE_UnlockBitmapBits(psurfSource);
}
Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1]
(original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] Sat
Apr 17 16:46:05 2010
@@ -307,6 +307,8 @@
COLORREF TransColor)
{
PDC DCDest, DCSrc;
+ HDC ahDC[2];
+ PGDIOBJ apObj[2];
RECTL rcDest, rcSrc;
SURFACE *BitmapDest, *BitmapSrc = NULL;
HPALETTE SourcePalette = 0, DestPalette = 0;
@@ -316,42 +318,54 @@
BOOL Ret = FALSE;
EXLATEOBJ exlo;
- if(!(DCDest = DC_LockDc(hdcDst)))
- {
- DPRINT1("Invalid destination dc handle (0x%08x) passed to
NtGdiTransparentBlt\n", hdcDst);
+ DPRINT("Locking DCs\n");
+ ahDC[0] = hdcDst;
+ ahDC[1] = hdcSrc ;
+ GDIOBJ_LockMultipleObjs(2, ahDC, apObj);
+ DCDest = apObj[0];
+ DCSrc = apObj[1];
+
+ if ((NULL == DCDest) || (NULL == DCSrc))
+ {
+ DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to
NtGdiAlphaBlend\n", hdcDst, hdcSrc);
SetLastWin32Error(ERROR_INVALID_HANDLE);
+ if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
+ if(DCDest) GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
return FALSE;
}
- if (DCDest->dctype == DC_TYPE_INFO)
- {
- DC_UnlockDc(DCDest);
+
+ if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO)
+ {
+ GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
+ GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
/* 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->dctype == DC_TYPE_INFO)
- {
- DC_UnlockDc(DCSrc);
- if(hdcDst != hdcSrc)
- {
- DC_UnlockDc(DCDest);
- }
- /* Yes, Windows really returns TRUE in this case */
- return TRUE;
- }
+ rcDest.left = xDst;
+ rcDest.top = yDst;
+ rcDest.right = rcDest.left + cxDst;
+ rcDest.bottom = rcDest.top + cyDst;
+ IntLPtoDP(DCDest, (LPPOINT)&rcDest, 2);
+
+ rcDest.left += DCDest->ptlDCOrig.x;
+ rcDest.top += DCDest->ptlDCOrig.y;
+ rcDest.right += DCDest->ptlDCOrig.x;
+ rcDest.bottom += DCDest->ptlDCOrig.y;
+
+ rcSrc.left = xSrc;
+ rcSrc.top = ySrc;
+ rcSrc.right = rcSrc.left + cxSrc;
+ rcSrc.bottom = rcSrc.top + cySrc;
+ IntLPtoDP(DCSrc, (LPPOINT)&rcSrc, 2);
+
+ rcSrc.left += DCSrc->ptlDCOrig.x;
+ rcSrc.top += DCSrc->ptlDCOrig.y;
+ rcSrc.right += DCSrc->ptlDCOrig.x;
+ rcSrc.bottom += DCSrc->ptlDCOrig.y;
+
+ /* Prepare for blit */
+ DC_vPrepareDCsForBlit(DCDest, rcDest, DCSrc, rcSrc);
BitmapDest = DCDest->dclevel.pSurface;
if (!BitmapDest)
@@ -402,39 +416,17 @@
EXLATEOBJ_vInitialize(&exlo, PalSourceGDI, PalDestGDI, 0, 0, 0);
- rcDest.left = xDst;
- rcDest.top = yDst;
- rcDest.right = rcDest.left + cxDst;
- rcDest.bottom = rcDest.top + cyDst;
- IntLPtoDP(DCDest, (LPPOINT)&rcDest, 2);
-
- rcDest.left += DCDest->ptlDCOrig.x;
- rcDest.top += DCDest->ptlDCOrig.y;
- rcDest.right += DCDest->ptlDCOrig.x;
- rcDest.bottom += DCDest->ptlDCOrig.y;
-
- rcSrc.left = xSrc;
- rcSrc.top = ySrc;
- rcSrc.right = rcSrc.left + cxSrc;
- rcSrc.bottom = rcSrc.top + cySrc;
- IntLPtoDP(DCSrc, (LPPOINT)&rcSrc, 2);
-
- rcSrc.left += DCSrc->ptlDCOrig.x;
- rcSrc.top += DCSrc->ptlDCOrig.y;
- rcSrc.right += DCSrc->ptlDCOrig.x;
- rcSrc.bottom += DCSrc->ptlDCOrig.y;
-
Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc,
TransparentColor, 0);
+ EXLATEOBJ_vCleanup(&exlo);
+
done:
- DC_UnlockDc(DCSrc);
- if(hdcDst != hdcSrc)
- {
- DC_UnlockDc(DCDest);
- }
- EXLATEOBJ_vCleanup(&exlo);
+ DC_vFinishBlit(DCDest, DCSrc);
+ GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
+ GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
+
return Ret;
}