From ba31bc03cadb71f2638c411fc6d6e6a2d9b55d38 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 11 Jul 2009 20:15:37 +0000 Subject: [PATCH] [win32k] Implement brush realization part 2 / 2 Use EBRUSHOBJ_pvGetEngBrush to get a handle to the realized (color translated) brush and use this instead of the original pattern when doing patblts. We don't use any XLATEOBJ anymore. I'll leave it to the interested reader to cleanup the DIB code from remnants of pattern to dest color translation. svn path=/trunk/; revision=41892 --- reactos/subsystems/win32/win32k/eng/bitblt.c | 31 ++++-------- .../subsystems/win32/win32k/eng/engbrush.c | 4 +- .../subsystems/win32/win32k/eng/stretchblt.c | 48 ++++++++----------- .../subsystems/win32/win32k/include/brush.h | 4 ++ 4 files changed, 36 insertions(+), 51 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index acd65aab9f7..60dc1555632 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -48,9 +48,8 @@ BltMask(SURFOBJ* psoDest, LONG PatternX0 = 0, PatternX = 0, PatternY = 0; PFN_DIB_PutPixel fnDest_PutPixel = NULL; PFN_DIB_GetPixel fnPattern_GetPixel = NULL; - XLATEOBJ *XlateObj; ULONG Pattern = 0; - SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); + HBITMAP hbmPattern; if (psoMask == NULL) { @@ -61,7 +60,8 @@ BltMask(SURFOBJ* psoDest, { pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); - psurfPattern = SURFACE_LockSurface(pebo->pbrush->hbmPattern); + hbmPattern = EBRUSHOBJ_pvGetEngBrush(pebo); + psurfPattern = SURFACE_LockSurface(hbmPattern); if (psurfPattern != NULL) { psoPattern = &psurfPattern->SurfObj; @@ -79,9 +79,6 @@ BltMask(SURFOBJ* psoDest, fnDest_PutPixel = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_PutPixel; if (psurfPattern) { - XlateObj = IntCreateBrushXlate(pebo->pbrush, - psurfDest, - pebo->crCurrentBack); PatternY = (prclDest->top - pptlBrush->y) % PatternHeight; if (PatternY < 0) { @@ -104,8 +101,7 @@ BltMask(SURFOBJ* psoDest, if (*pjMskCurrent & fjMaskBit) { fnDest_PutPixel(psoDest, x, y, - XLATEOBJ_iXlate(XlateObj, - fnPattern_GetPixel(psoPattern, PatternX, PatternY))); + fnPattern_GetPixel(psoPattern, PatternX, PatternY)); } fjMaskBit = _rotr8(fjMaskBit, 1); pjMskCurrent += (fjMaskBit >> 7); @@ -116,9 +112,6 @@ BltMask(SURFOBJ* psoDest, PatternY++; PatternY %= PatternHeight; } - - if (XlateObj) - EngDeleteXlate(XlateObj); } else { @@ -183,8 +176,7 @@ CallDibBitBlt(SURFOBJ* OutputObj, PEBRUSHOBJ GdiBrush = NULL; SURFACE *psurfPattern; BOOLEAN Result; - SURFACE *psurfDest = CONTAINING_RECORD(OutputObj, SURFACE, SurfObj); - XLATEOBJ *XlatePatternToDest = NULL; + HBITMAP hbmPattern; BltInfo.DestSurface = OutputObj; BltInfo.SourceSurface = InputObj; @@ -205,7 +197,9 @@ CallDibBitBlt(SURFOBJ* OutputObj, if (ROP4_USES_PATTERN(Rop4) && pbo && pbo->iSolidColor == 0xFFFFFFFF) { GdiBrush = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); - if ((psurfPattern = SURFACE_LockSurface(GdiBrush->pbrush->hbmPattern))) + hbmPattern = EBRUSHOBJ_pvGetEngBrush(GdiBrush); + psurfPattern = SURFACE_LockSurface(hbmPattern); + if (psurfPattern) { BltInfo.PatternSurface = &psurfPattern->SurfObj; } @@ -213,10 +207,6 @@ CallDibBitBlt(SURFOBJ* OutputObj, { /* FIXME - What to do here? */ } - XlatePatternToDest = IntCreateBrushXlate(GdiBrush->pbrush, - psurfDest, - GdiBrush->crCurrentBack); - BltInfo.XlatePatternToDest = XlatePatternToDest; } else { @@ -225,11 +215,8 @@ CallDibBitBlt(SURFOBJ* OutputObj, Result = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBlt(&BltInfo); - if (XlatePatternToDest) - EngDeleteXlate(XlatePatternToDest); - /* Pattern brush */ - if (psurfPattern != NULL) + if (psurfPattern) { SURFACE_UnlockSurface(psurfPattern); } diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index ec6fe37c6a8..2af10b6cc0e 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -276,8 +276,10 @@ BRUSHOBJ_pvGetRbrush( if (!bResult) { if (pbo->pvRbrush) + { EngFreeMem(pbo->pvRbrush); - pbo->pvRbrush = NULL; + pbo->pvRbrush = NULL; + } } } diff --git a/reactos/subsystems/win32/win32k/eng/stretchblt.c b/reactos/subsystems/win32/win32k/eng/stretchblt.c index 58a32f229b6..8b1290d793f 100644 --- a/reactos/subsystems/win32/win32k/eng/stretchblt.c +++ b/reactos/subsystems/win32/win32k/eng/stretchblt.c @@ -38,9 +38,8 @@ CallDibStretchBlt(SURFOBJ* psoDest, SURFACE* psurfPattern; PEBRUSHOBJ GdiBrush = NULL; SURFOBJ* PatternSurface = NULL; - XLATEOBJ* XlatePatternToDest = NULL; BOOL bResult; - SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); + HBITMAP hbmPattern; if (BrushOrigin == NULL) { @@ -55,7 +54,8 @@ CallDibStretchBlt(SURFOBJ* psoDest, if (ROP4_USES_PATTERN(Rop4) && pbo && pbo->iSolidColor == 0xFFFFFFFF) { GdiBrush = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); - psurfPattern = SURFACE_LockSurface(GdiBrush->pbrush->hbmPattern); + hbmPattern = EBRUSHOBJ_pvGetEngBrush(GdiBrush); + psurfPattern = SURFACE_LockSurface(hbmPattern); if (psurfPattern) { PatternSurface = &psurfPattern->SurfObj; @@ -64,9 +64,6 @@ CallDibStretchBlt(SURFOBJ* psoDest, { /* FIXME - What to do here? */ } - XlatePatternToDest = IntCreateBrushXlate(GdiBrush->pbrush, - psurfDest, - GdiBrush->crCurrentBack); } else { @@ -76,12 +73,7 @@ CallDibStretchBlt(SURFOBJ* psoDest, bResult = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_StretchBlt( psoDest, psoSource, Mask, PatternSurface, OutputRect, InputRect, MaskOrigin, pbo, &RealBrushOrigin, - ColorTranslation, XlatePatternToDest, Rop4); - - if (XlatePatternToDest) - { - EngDeleteXlate(XlatePatternToDest); - } + ColorTranslation, NULL, Rop4); /* Pattern brush */ if (psurfPattern) @@ -155,7 +147,7 @@ EngStretchBltROP( /* Copy destination onto itself: nop */ return TRUE; } - + OutputRect = *prclDest; if (OutputRect.right < OutputRect.left) { @@ -167,7 +159,7 @@ EngStretchBltROP( OutputRect.top = prclDest->bottom; OutputRect.bottom = prclDest->top; } - + InputRect = *prclSrc; if (UsesSource) { @@ -256,12 +248,12 @@ EngStretchBltROP( switch (clippingType) { case DC_TRIVIAL: - Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, + Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, ColorTranslation, &OutputRect, &InputRect, MaskOrigin, pbo, &AdjustedBrushOrigin, ROP4); break; case DC_RECT: - // Clip the blt to the clip rectangle + // Clip the blt to the clip rectangle ClipRect.left = ClipRegion->rclBounds.left + Translate.x; ClipRect.right = ClipRegion->rclBounds.right + Translate.x; ClipRect.top = ClipRegion->rclBounds.top + Translate.y; @@ -272,13 +264,13 @@ EngStretchBltROP( InputToCombinedRect.bottom = InputRect.top + (CombinedRect.bottom - OutputRect.top) * SrcHeight / DstHeight; InputToCombinedRect.left = InputRect.left + (CombinedRect.left - OutputRect.left) * SrcWidth / DstWidth; InputToCombinedRect.right = InputRect.left + (CombinedRect.right - OutputRect.left) * SrcWidth / DstWidth; - Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, - ColorTranslation, + Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, + ColorTranslation, &CombinedRect, &InputToCombinedRect, MaskOrigin, - pbo, - &AdjustedBrushOrigin, + pbo, + &AdjustedBrushOrigin, ROP4); } break; @@ -317,13 +309,13 @@ EngStretchBltROP( InputToCombinedRect.bottom = InputRect.top + (CombinedRect.bottom - OutputRect.top) * SrcHeight / DstHeight; InputToCombinedRect.left = InputRect.left + (CombinedRect.left - OutputRect.left) * SrcWidth / DstWidth; InputToCombinedRect.right = InputRect.left + (CombinedRect.right - OutputRect.left) * SrcWidth / DstWidth; - Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, - ColorTranslation, + Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, + ColorTranslation, &CombinedRect, &InputToCombinedRect, MaskOrigin, - pbo, - &AdjustedBrushOrigin, + pbo, + &AdjustedBrushOrigin, ROP4); } } @@ -415,7 +407,7 @@ IntEngStretchBlt(SURFOBJ *psoDest, InputClippedRect.top = DestRect->bottom; InputClippedRect.bottom = DestRect->top; } - + if (UsesSource) { if (NULL == SourceRect || NULL == psoSource) @@ -423,14 +415,14 @@ IntEngStretchBlt(SURFOBJ *psoDest, return FALSE; } InputRect = *SourceRect; - + if (InputRect.right < InputRect.left || InputRect.bottom < InputRect.top) { /* Everything clipped away, nothing to do */ return TRUE; } - } + } if (ClipRegion) { @@ -454,7 +446,7 @@ IntEngStretchBlt(SURFOBJ *psoDest, { OutputRect = InputClippedRect; } - + if (pMaskOrigin != NULL) { MaskOrigin.x = pMaskOrigin->x; MaskOrigin.y = pMaskOrigin->y; diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index 8ae24fe0b41..6bb2ad30de0 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -124,4 +124,8 @@ VOID NTAPI EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo); +PVOID +NTAPI +EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo); + #endif