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

View file

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

View file

@ -938,26 +938,6 @@ EngReadStateEvent(
UNIMPLEMENTED; UNIMPLEMENTED;
return 0; 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 * @unimplemented