mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
[WIN32K]
- Now we welcome GreStretchBltMask into the fabulous world of GDIOBJ_LockMultipleObjects, DC_vPrepareDCsForBlit and DC_vFinishBlit - With the assorted MouseSafetyOnDraw{Start,End} removal svn path=/branches/reactos-yarotows/; revision=46908
This commit is contained in:
parent
663acbc064
commit
d2655f9e72
|
@ -463,8 +463,6 @@ IntEngStretchBlt(SURFOBJ *psoDest,
|
|||
/* No success yet */
|
||||
ret = FALSE;
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
|
||||
OutputRect.right, OutputRect.bottom);
|
||||
|
||||
if (UsesSource)
|
||||
{
|
||||
|
@ -473,8 +471,6 @@ IntEngStretchBlt(SURFOBJ *psoDest,
|
|||
{
|
||||
SURFACE_LockBitmapBits(psurfSource);
|
||||
}
|
||||
MouseSafetyOnDrawStart(psoSource, InputRect.left, InputRect.top,
|
||||
InputRect.right, InputRect.bottom);
|
||||
}
|
||||
|
||||
/* Prepare color adjustment */
|
||||
|
@ -516,13 +512,11 @@ IntEngStretchBlt(SURFOBJ *psoDest,
|
|||
|
||||
if (UsesSource)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
if (psoSource != psoDest)
|
||||
{
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
}
|
||||
}
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -708,6 +708,8 @@ GreStretchBltMask(
|
|||
PDC DCDest;
|
||||
PDC DCSrc = NULL;
|
||||
PDC DCMask = NULL;
|
||||
HDC ahDC[3];
|
||||
PGDIOBJ apObj[3];
|
||||
PDC_ATTR pdcattr;
|
||||
SURFACE *BitmapDest, *BitmapSrc = NULL;
|
||||
SURFACE *BitmapMask = NULL;
|
||||
|
@ -726,45 +728,55 @@ GreStretchBltMask(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
DCDest = DC_LockDc(hDCDest);
|
||||
DPRINT("Locking DCs\n");
|
||||
ahDC[0] = hDCDest;
|
||||
ahDC[1] = hDCSrc ;
|
||||
ahDC[2] = hDCMask ;
|
||||
GDIOBJ_LockMultipleObjs(3, ahDC, apObj);
|
||||
DCDest = apObj[0];
|
||||
DCSrc = apObj[1];
|
||||
DCMask = apObj[2];
|
||||
|
||||
if (NULL == DCDest)
|
||||
{
|
||||
DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCDest);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
|
||||
if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject);
|
||||
DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (DCDest->dctype == DC_TYPE_INFO)
|
||||
{
|
||||
DC_UnlockDc(DCDest);
|
||||
if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
|
||||
if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject);
|
||||
GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
|
||||
/* 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);
|
||||
GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
|
||||
if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject);
|
||||
DPRINT("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc);
|
||||
return FALSE;
|
||||
}
|
||||
if (DCSrc->dctype == DC_TYPE_INFO)
|
||||
{
|
||||
DC_UnlockDc(DCSrc);
|
||||
DC_UnlockDc(DCDest);
|
||||
GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject);
|
||||
GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
|
||||
if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject);
|
||||
/* Yes, Windows really returns TRUE in this case */
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if(DCSrc)
|
||||
{
|
||||
DCSrc = DCDest;
|
||||
}
|
||||
DPRINT1("Getting a valid Source handle without using source!!!");
|
||||
GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject);
|
||||
DCSrc = NULL ;
|
||||
}
|
||||
|
||||
pdcattr = DCDest->pdcattr;
|
||||
|
@ -801,6 +813,9 @@ GreStretchBltMask(
|
|||
BrushOrigin.x = 0;
|
||||
BrushOrigin.y = 0;
|
||||
|
||||
/* Only prepare Source and Dest, hdcMask represents a DIB */
|
||||
DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect);
|
||||
|
||||
/* Determine surfaces to be used in the bitblt */
|
||||
BitmapDest = DCDest->dclevel.pSurface;
|
||||
if (BitmapDest == NULL)
|
||||
|
@ -821,10 +836,7 @@ GreStretchBltMask(
|
|||
BrushOrigin.y += DCDest->ptlDCOrig.y;
|
||||
|
||||
/* Make mask surface for source surface */
|
||||
if (BitmapSrc && hDCMask)
|
||||
{
|
||||
DCMask = DC_LockDc(hDCMask);
|
||||
if (DCMask)
|
||||
if (BitmapSrc && DCMask)
|
||||
{
|
||||
BitmapMask = DCMask->dclevel.pSurface;
|
||||
if (BitmapMask &&
|
||||
|
@ -834,6 +846,7 @@ GreStretchBltMask(
|
|||
DPRINT1("%dx%d mask is smaller than %dx%d bitmap\n",
|
||||
BitmapMask->SurfObj.sizlBitmap.cx, BitmapMask->SurfObj.sizlBitmap.cy,
|
||||
WidthSrc, HeightSrc);
|
||||
EXLATEOBJ_vCleanup(&exlo);
|
||||
goto failed;
|
||||
}
|
||||
/* Create mask offset point */
|
||||
|
@ -843,7 +856,6 @@ GreStretchBltMask(
|
|||
MaskPoint.x += DCMask->ptlDCOrig.x;
|
||||
MaskPoint.y += DCMask->ptlDCOrig.x;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform the bitblt operation */
|
||||
Status = IntEngStretchBlt(&BitmapDest->SurfObj,
|
||||
|
@ -857,13 +869,14 @@ GreStretchBltMask(
|
|||
&DCDest->eboFill.BrushObject,
|
||||
&BrushOrigin,
|
||||
ROP3_TO_ROP4(ROP));
|
||||
|
||||
failed:
|
||||
if (UsesSource)
|
||||
{
|
||||
EXLATEOBJ_vCleanup(&exlo);
|
||||
}
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
|
||||
failed:
|
||||
DC_vFinishBlit(DCDest, DCSrc);
|
||||
if (UsesSource)
|
||||
{
|
||||
DC_UnlockDc(DCSrc);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue