Preparation for StretchBlt pattern support:

- Supply BrushObj and BrushOrigin to IntStretchBlt
- Implement EngStretchBltROP to do the work, let EngStretchBlt call it (this allows ROP support for real now)

svn path=/trunk/; revision=39501
This commit is contained in:
Gregor Schneider 2009-02-08 20:28:20 +00:00
parent 43ef418be5
commit c74ee95b77
3 changed files with 57 additions and 34 deletions

View file

@ -771,8 +771,7 @@ NtGdiEngStretchBlt(
IN RECTL *prclDest,
IN RECTL *prclSrc,
IN POINTL *MaskOrigin,
IN ULONG Mode
)
IN ULONG Mode)
{
COLORADJUSTMENT ca;
POINTL lBrushOrigin;
@ -807,9 +806,12 @@ NtGdiEngStretchBlt(
return EngStretchBlt(psoDest, psoSource, Mask, ClipRegion, ColorTranslation, &ca, &lBrushOrigin, &rclDest, &rclSrc, &lMaskOrigin, Mode);
}
/*
* @implemented
*/
BOOL
APIENTRY
EngStretchBlt(
EngStretchBltROP(
IN SURFOBJ *psoDest,
IN SURFOBJ *psoSource,
IN SURFOBJ *Mask,
@ -820,11 +822,10 @@ EngStretchBlt(
IN RECTL *prclDest,
IN RECTL *prclSrc,
IN POINTL *MaskOrigin,
IN ULONG Mode
)
IN ULONG Mode,
IN BRUSHOBJ *Brush,
IN DWORD ROP4)
{
// www.osr.com/ddk/graphics/gdifncs_0bs7.htm
RECTL InputRect;
RECTL OutputRect;
POINTL Translate;
@ -835,9 +836,9 @@ EngStretchBlt(
PSTRETCHRECTFUNC BltRectFunc;
BOOLEAN Ret;
POINTL AdjustedBrushOrigin;
BOOL UsesSource = ROP4_USES_SOURCE(Mode);
BOOL UsesSource = ROP4_USES_SOURCE(ROP4);
if (Mode == R4_NOOP)
if (ROP4 == R4_NOOP)
{
/* Copy destination onto itself: nop */
return TRUE;
@ -964,7 +965,7 @@ EngStretchBlt(
Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, ClipRegion,
ColorTranslation, &OutputRect, &InputRect, MaskOrigin,
&AdjustedBrushOrigin, Mode);
&AdjustedBrushOrigin, ROP4);
IntEngLeave(&EnterLeaveDest);
if (UsesSource)
@ -975,6 +976,40 @@ EngStretchBlt(
return Ret;
}
/*
* @implemented
*/
BOOL
APIENTRY
EngStretchBlt(
IN SURFOBJ *psoDest,
IN SURFOBJ *psoSource,
IN SURFOBJ *Mask,
IN CLIPOBJ *ClipRegion,
IN XLATEOBJ *ColorTranslation,
IN COLORADJUSTMENT *pca,
IN POINTL *BrushOrigin,
IN RECTL *prclDest,
IN RECTL *prclSrc,
IN POINTL *MaskOrigin,
IN ULONG Mode)
{
return EngStretchBltROP(
psoDest,
psoSource,
Mask,
ClipRegion,
ColorTranslation,
pca,
BrushOrigin,
prclDest,
prclSrc,
MaskOrigin,
Mode,
NULL,
SRCCOPY);
}
BOOL APIENTRY
IntEngStretchBlt(SURFOBJ *psoDest,
SURFOBJ *psoSource,
@ -1104,8 +1139,8 @@ IntEngStretchBlt(SURFOBJ *psoDest,
if (! ret)
{
// FIXME: see previous fixme
ret = EngStretchBlt(psoDest, psoSource, MaskSurf, ClipRegion, ColorTranslation,
&ca, BrushOrigin, &OutputRect, &InputRect, NULL, ROP);
ret = EngStretchBltROP(psoDest, psoSource, MaskSurf, ClipRegion, ColorTranslation,
&ca, BrushOrigin, &OutputRect, &InputRect, NULL, COLORONCOLOR, Brush, ROP);
}
if (UsesSource)

View file

@ -756,7 +756,9 @@ NtGdiStretchBlt(
RECTL SourceRect;
BOOL Status = FALSE;
XLATEOBJ *XlateObj = NULL;
POINTL BrushOrigin;
PGDIBRUSHOBJ BrushObj = NULL;
GDIBRUSHINST BrushInst;
BOOL UsesSource = ROP3_USES_SOURCE(ROP);
BOOL UsesPattern = ROP3_USES_PATTERN(ROP);
@ -835,6 +837,9 @@ NtGdiStretchBlt(
IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2);
}
BrushOrigin.x = 0;
BrushOrigin.y = 0;
/* Determine surfaces to be used in the bitblt */
BitmapDest = SURFACE_LockSurface(DCDest->w.hBitmap);
if (BitmapDest == NULL)
@ -920,13 +925,16 @@ NtGdiStretchBlt(
SetLastWin32Error(ERROR_INVALID_HANDLE);
goto failed;
}
BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin);
IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush);
}
/* Perform the bitblt operation */
Status = IntEngStretchBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
NULL, DCDest->CombinedClip, XlateObj,
&DestRect, &SourceRect, NULL, NULL, NULL,
ROP3_TO_ROP4(ROP));
&DestRect, &SourceRect, NULL,
BrushObj ? &BrushInst.BrushObject : NULL,
&BrushOrigin, ROP3_TO_ROP4(ROP));
failed:
if (XlateObj)

View file

@ -938,26 +938,6 @@ EngReadStateEvent(
UNIMPLEMENTED;
return 0;
}
BOOL APIENTRY
EngStretchBltROP(
IN SURFOBJ *Dest,
IN SURFOBJ *Source,
IN SURFOBJ *Mask,
IN CLIPOBJ *Clip,
IN XLATEOBJ *Xlate,
IN COLORADJUSTMENT *ColorAdjustment,
IN POINTL *BrushOrigin,
IN RECTL *DestRect,
IN RECTL *SourceRect,
IN POINTL *MaskPoint,
IN ULONG Mode,
IN BRUSHOBJ *BrushObj,
IN DWORD ROP4)
{
UNIMPLEMENTED;
return FALSE;
}
/*
* @unimplemented