Author: tkreuzer
Date: Sun May 13 22:31:28 2012
New Revision: 56582
URL:
http://svn.reactos.org/svn/reactos?rev=56582&view=rev
Log:
[WIN32K]
- Handle unknown color types in TranslateCOLORREF
- properly translate the color back to RGB in NtGdiSetPixel
Fixes a few hundred thousand gdi32 winetests (dib) :)
Modified:
trunk/reactos/win32ss/gdi/ntgdi/bitblt.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/bitblt.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] Sun May 13 22:31:28 2012
@@ -18,11 +18,10 @@
#define ROP_TO_ROP4(Rop) ((Rop) >> 16)
ULONG
-TranslateCOLORREF(PDC pdc, COLORREF *pcrColor)
+TranslateCOLORREF(PDC pdc, COLORREF crColor)
{
PPALETTE ppalDC, ppalSurface;
ULONG index, ulColor, iBitmapFormat;
- COLORREF crColor = *pcrColor;
EXLATEOBJ exlo;
switch (crColor >> 24)
@@ -65,15 +64,11 @@
else if (iBitmapFormat == BMF_8BPP) index = crColor & 0xFF;
else if (iBitmapFormat == BMF_16BPP) index = crColor & 0xFFFF;
else index = crColor & 0xFFFFFF;
-
- /* Translate the color to RGB for the caller */
- ppalSurface = pdc->dclevel.pSurface->ppal;
- *pcrColor = PALETTE_ulGetRGBColorFromIndex(ppalSurface, index);
return index;
default:
DPRINT("Unsupported color type %d passed\n", crColor >> 24);
- return 0;
+ crColor &= 0xFFFFFF;
}
/* Initialize an XLATEOBJ from RGB to the target surface */
@@ -86,19 +81,6 @@
/* Cleanup the XLATEOBJ */
EXLATEOBJ_vCleanup(&exlo);
- /* Initialize an XLATEOBJ from the target surface to RGB */
- EXLATEOBJ_vInitialize(&exlo,
- ppalSurface,
- &gpalRGB,
- 0,
- pdc->pdcattr->crBackgroundClr,
- pdc->pdcattr->crForegroundClr);
-
- /* Translate the color back to RGB */
- *pcrColor = XLATEOBJ_iXlate(&exlo.xlo, ulColor);
-
- /* Cleanup and return the target format color */
- EXLATEOBJ_vCleanup(&exlo);
return ulColor;
}
@@ -1070,6 +1052,7 @@
BOOL bResult;
PEBRUSHOBJ pebo;
ULONG ulDirty;
+ EXLATEOBJ exlo;
/* Lock the DC */
pdc = DC_LockDc(hdc);
@@ -1088,7 +1071,7 @@
}
/* Translate the color to the target format and get the RGB value */
- iSolidColor = TranslateCOLORREF(pdc, &crColor);
+ iSolidColor = TranslateCOLORREF(pdc, crColor);
/* Use the DC's text brush, which is always a solid brush */
pebo = &pdc->eboText;
@@ -1106,6 +1089,20 @@
/* Restore old text brush color and dirty flags */
EBRUSHOBJ_iSetSolidColor(pebo, iOldColor);
pdc->pdcattr->ulDirty_ = ulDirty;
+
+ /* Initialize an XLATEOBJ from the target surface to RGB */
+ EXLATEOBJ_vInitialize(&exlo,
+ pdc->dclevel.pSurface->ppal,
+ &gpalRGB,
+ 0,
+ pdc->pdcattr->crBackgroundClr,
+ pdc->pdcattr->crForegroundClr);
+
+ /* Translate the color back to RGB */
+ crColor = XLATEOBJ_iXlate(&exlo.xlo, iSolidColor);
+
+ /* Cleanup and return the target format color */
+ EXLATEOBJ_vCleanup(&exlo);
/* Unlock the DC */
DC_UnlockDc(pdc);