diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 51eaabc59c4..86dbc4941b9 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -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) diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index 44739622357..4e9809df1bc 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -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) diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index 96f0736c68f..de53f465735 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -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