Fix broken parameter passing from EngMaskBitBlt to (Alpha)BltMask. It was passing the wrong surface and the wrong point. Rename some parameters to reflect what their usage is. Add ASSERTs to make sure noone passes useless parameters. Fixes crippled text in startmenu.
The whole code is broken by design, anyway it will go away, once the new text rendering code is done.
See issue #4379 for more details.

svn path=/trunk/; revision=47124
This commit is contained in:
Timo Kreuzer 2010-05-08 15:30:59 +00:00
parent f0d7ecd148
commit f820fe7a43

View file

@ -51,6 +51,9 @@ BltMask(SURFOBJ* psoDest,
ULONG Pattern = 0; ULONG Pattern = 0;
HBITMAP hbmPattern; HBITMAP hbmPattern;
ASSERT(psoSource == NULL);
ASSERT(pptlSource == NULL);
if (psoMask == NULL) if (psoMask == NULL)
{ {
return FALSE; return FALSE;
@ -662,8 +665,8 @@ static BOOLEAN APIENTRY
AlphaBltMask(SURFOBJ* psoDest, AlphaBltMask(SURFOBJ* psoDest,
SURFOBJ* psoSource, // unused SURFOBJ* psoSource, // unused
SURFOBJ* psoMask, SURFOBJ* psoMask,
XLATEOBJ* ColorTranslation, XLATEOBJ* pxloRGB2Dest,
XLATEOBJ* SrcColorTranslation, XLATEOBJ* pxloBrush,
RECTL* prclDest, RECTL* prclDest,
POINTL* pptlSource, // unused POINTL* pptlSource, // unused
POINTL* pptlMask, POINTL* pptlMask,
@ -675,12 +678,15 @@ AlphaBltMask(SURFOBJ* psoDest,
ULONG Background, BrushColor, NewColor; ULONG Background, BrushColor, NewColor;
BYTE *tMask, *lMask; BYTE *tMask, *lMask;
ASSERT(psoSource == NULL);
ASSERT(pptlSource == NULL);
dx = prclDest->right - prclDest->left; dx = prclDest->right - prclDest->left;
dy = prclDest->bottom - prclDest->top; dy = prclDest->bottom - prclDest->top;
if (psoMask != NULL) if (psoMask != NULL)
{ {
BrushColor = XLATEOBJ_iXlate(SrcColorTranslation, pbo ? pbo->iSolidColor : 0); BrushColor = XLATEOBJ_iXlate(pxloBrush, pbo ? pbo->iSolidColor : 0);
r = (int)GetRValue(BrushColor); r = (int)GetRValue(BrushColor);
g = (int)GetGValue(BrushColor); g = (int)GetGValue(BrushColor);
b = (int)GetBValue(BrushColor); b = (int)GetBValue(BrushColor);
@ -701,14 +707,14 @@ AlphaBltMask(SURFOBJ* psoDest,
else else
{ {
Background = DIB_GetSource(psoDest, prclDest->left + i, prclDest->top + j, Background = DIB_GetSource(psoDest, prclDest->left + i, prclDest->top + j,
SrcColorTranslation); pxloBrush);
NewColor = NewColor =
RGB((*lMask * (r - GetRValue(Background)) >> 8) + GetRValue(Background), RGB((*lMask * (r - GetRValue(Background)) >> 8) + GetRValue(Background),
(*lMask * (g - GetGValue(Background)) >> 8) + GetGValue(Background), (*lMask * (g - GetGValue(Background)) >> 8) + GetGValue(Background),
(*lMask * (b - GetBValue(Background)) >> 8) + GetBValue(Background)); (*lMask * (b - GetBValue(Background)) >> 8) + GetBValue(Background));
Background = XLATEOBJ_iXlate(ColorTranslation, NewColor); Background = XLATEOBJ_iXlate(pxloRGB2Dest, NewColor);
DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_PutPixel( DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_PutPixel(
psoDest, prclDest->left + i, prclDest->top + j, Background); psoDest, prclDest->left + i, prclDest->top + j, Background);
} }
@ -846,10 +852,10 @@ EngMaskBitBlt(SURFOBJ *psoDest,
case DC_TRIVIAL: case DC_TRIVIAL:
if (psoMask->iBitmapFormat == BMF_8BPP) if (psoMask->iBitmapFormat == BMF_8BPP)
Ret = AlphaBltMask(psoOutput, NULL , psoInput, DestColorTranslation, SourceColorTranslation, Ret = AlphaBltMask(psoOutput, NULL , psoInput, DestColorTranslation, SourceColorTranslation,
&OutputRect, &InputPoint, pptlMask, pbo, &AdjustedBrushOrigin); &OutputRect, NULL, &InputPoint, pbo, &AdjustedBrushOrigin);
else else
Ret = BltMask(psoOutput, NULL, psoInput, DestColorTranslation, Ret = BltMask(psoOutput, NULL, psoInput, DestColorTranslation,
&OutputRect, &InputPoint, pptlMask, pbo, &AdjustedBrushOrigin, &OutputRect, NULL, &InputPoint, pbo, &AdjustedBrushOrigin,
R4_MASK); R4_MASK);
break; break;
case DC_RECT: case DC_RECT:
@ -864,13 +870,13 @@ EngMaskBitBlt(SURFOBJ *psoDest,
Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top;
if (psoMask->iBitmapFormat == BMF_8BPP) if (psoMask->iBitmapFormat == BMF_8BPP)
{ {
Ret = AlphaBltMask(psoOutput, psoInput, psoMask, DestColorTranslation, SourceColorTranslation, Ret = AlphaBltMask(psoOutput, NULL, psoInput, DestColorTranslation, SourceColorTranslation,
&CombinedRect, &Pt, pptlMask, pbo, &AdjustedBrushOrigin); &CombinedRect, NULL, &Pt, pbo, &AdjustedBrushOrigin);
} }
else else
{ {
Ret = BltMask(psoOutput, psoInput, psoMask, DestColorTranslation, Ret = BltMask(psoOutput, NULL, psoInput, DestColorTranslation,
&CombinedRect, &Pt, pptlMask, pbo, &AdjustedBrushOrigin, R4_MASK); &CombinedRect, NULL, &Pt, pbo, &AdjustedBrushOrigin, R4_MASK);
} }
} }
break; break;
@ -908,17 +914,17 @@ EngMaskBitBlt(SURFOBJ *psoDest,
Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top;
if (psoMask->iBitmapFormat == BMF_8BPP) if (psoMask->iBitmapFormat == BMF_8BPP)
{ {
Ret = AlphaBltMask(psoOutput, psoInput, psoMask, Ret = AlphaBltMask(psoOutput, NULL, psoInput,
DestColorTranslation, DestColorTranslation,
SourceColorTranslation, SourceColorTranslation,
&CombinedRect, &Pt, pptlMask, pbo, &CombinedRect, NULL, &Pt, pbo,
&AdjustedBrushOrigin) && Ret; &AdjustedBrushOrigin) && Ret;
} }
else else
{ {
Ret = BltMask(psoOutput, psoInput, psoMask, Ret = BltMask(psoOutput, NULL, psoInput,
DestColorTranslation, &CombinedRect, &Pt, DestColorTranslation, &CombinedRect, NULL,
pptlMask, pbo, &AdjustedBrushOrigin, &Pt, pbo, &AdjustedBrushOrigin,
R4_MASK) && Ret; R4_MASK) && Ret;
} }
} }