mirror of
https://github.com/reactos/reactos.git
synced 2024-07-07 21:25:05 +00:00
[WIN32K]
-Use GDIOBJ_LockMultipleObjs, DC_vPrepareDCsForBlit and DC_vFinishBlit in NtGdiTransparentBlt -Get rid of MouseSafetyOnDraw{End,Start} in IntEngTransparentBlt svn path=/branches/reactos-yarotows/; revision=46905
This commit is contained in:
parent
859f9c2a13
commit
42073050d4
|
@ -76,7 +76,7 @@ EngTransparentBlt(SURFOBJ *psoDest,
|
|||
OutputRect.top = DestRect->bottom;
|
||||
OutputRect.bottom = DestRect->top;
|
||||
}
|
||||
|
||||
|
||||
if(Clip)
|
||||
{
|
||||
if(OutputRect.left < Clip->rclBounds.left)
|
||||
|
@ -287,12 +287,8 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
|
|||
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 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
|
|||
&OutputRect, &InputRect, iTransColor, Reserved);
|
||||
}
|
||||
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
if(psoSource != psoDest)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
}
|
||||
|
||||
|
|
|
@ -307,6 +307,8 @@ NtGdiTransparentBlt(
|
|||
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 @@ NtGdiTransparentBlt(
|
|||
BOOL Ret = FALSE;
|
||||
EXLATEOBJ exlo;
|
||||
|
||||
if(!(DCDest = DC_LockDc(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 destination dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcDst);
|
||||
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)
|
||||
|
||||
if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO)
|
||||
{
|
||||
DC_UnlockDc(DCDest);
|
||||
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;
|
||||
}
|
||||
rcDest.left = xDst;
|
||||
rcDest.top = yDst;
|
||||
rcDest.right = rcDest.left + cxDst;
|
||||
rcDest.bottom = rcDest.top + cyDst;
|
||||
IntLPtoDP(DCDest, (LPPOINT)&rcDest, 2);
|
||||
|
||||
if(hdcDst == hdcSrc)
|
||||
{
|
||||
DCSrc = DCDest;
|
||||
}
|
||||
rcDest.left += DCDest->ptlDCOrig.x;
|
||||
rcDest.top += DCDest->ptlDCOrig.y;
|
||||
rcDest.right += DCDest->ptlDCOrig.x;
|
||||
rcDest.bottom += DCDest->ptlDCOrig.y;
|
||||
|
||||
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;
|
||||
}
|
||||
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 @@ NtGdiTransparentBlt(
|
|||
|
||||
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);
|
||||
|
||||
done:
|
||||
DC_UnlockDc(DCSrc);
|
||||
if(hdcDst != hdcSrc)
|
||||
{
|
||||
DC_UnlockDc(DCDest);
|
||||
}
|
||||
EXLATEOBJ_vCleanup(&exlo);
|
||||
|
||||
done:
|
||||
DC_vFinishBlit(DCDest, DCSrc);
|
||||
GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
|
||||
GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue