X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=subsystems%2Fwin32%2Fwin32k%2Feng%2Fxlate.c;h=a1ec18913a1fa934a05a3a548a4922439d29dfb1;hp=fcdd0b89b4b8e9264291669df1ff044a2cb26b45;hb=e84aac6fb8e54423d617f3720d10365b319866ba;hpb=e4a060ead45b9dc87a64408b6d791ea4a5fef55e diff --git a/subsystems/win32/win32k/eng/xlate.c b/subsystems/win32/win32k/eng/xlate.c index fcdd0b89b4b..a1ec18913a1 100644 --- a/subsystems/win32/win32k/eng/xlate.c +++ b/subsystems/win32/win32k/eng/xlate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #include @@ -65,10 +65,10 @@ EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor) ULONG iNewColor; /* Copy green */ - iNewColor = iColor & 0x00ff00; + iNewColor = iColor & 0xff00ff00; /* Mask red and blue */ - iColor &= 0xff00ff; + iColor &= 0x00ff00ff; /* Shift and copy red and blue */ iNewColor |= iColor >> 16; @@ -83,24 +83,45 @@ EXLATEOBJ_iXlateRGBto555(PEXLATEOBJ pxlo, ULONG iColor) { ULONG iNewColor; + /* Copy blue */ + iColor >>= 3; + iNewColor = iColor & 0x1F; + + /* Copy green */ + iColor >>= 3; + iNewColor |= iColor & 0x3E0; + + /* Copy red */ + iColor >>= 3; + iNewColor |= iColor & 0x7C00; + + return iNewColor; +} + +ULONG +FASTCALL +EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor) +{ + ULONG iNewColor; + /* Copy red */ iColor <<= 7; iNewColor = iColor & 0x7C00; /* Copy green */ iColor >>= 13; - iNewColor |= iColor & 0x3E0; + iNewColor |= (iColor & 0x3E0); - /* Copy green */ + /* Copy blue */ iColor >>= 13; - iNewColor |= iColor & 0x1F; + iNewColor |= (iColor & 0x1F); return iNewColor; } ULONG FASTCALL -EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor) +EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor) { ULONG iNewColor; @@ -109,19 +130,19 @@ EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor) iNewColor = iColor & 0x1f; /* Copy green */ - iColor >>= 3; - iNewColor |= (iColor & 0x3E0); + iColor >>= 2; + iNewColor |= (iColor & 0x7E0); /* Copy red */ iColor >>= 3; - iNewColor |= (iColor & 0x7C00); + iNewColor |= (iColor & 0xF800); return iNewColor; } ULONG FASTCALL -EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor) +EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor) { ULONG iNewColor; @@ -140,27 +161,6 @@ EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor) return iNewColor; } -ULONG -FASTCALL -EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor) -{ - ULONG iNewColor; - - /* Copy blue */ - iColor >>= 3; - iNewColor = iColor & 0x1f; - - /* Copy green */ - iColor >>= 2; - iNewColor |= (iColor & 0x7E0); - - /* Copy red */ - iColor >>= 3; - iNewColor |= (iColor & 0xF800); - - return iNewColor; -} - ULONG FASTCALL EXLATEOBJ_iXlateRGBtoPal(PEXLATEOBJ pexlo, ULONG iColor) @@ -175,7 +175,7 @@ EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor) ULONG iNewColor; /* Copy blue */ - iNewColor = gajXlate5to8[iColor & 0x1F] << 16; + iNewColor = gajXlate5to8[iColor & 0x1F]; /* Copy green */ iColor >>= 5; @@ -183,7 +183,7 @@ EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor) /* Copy red */ iColor >>= 5; - iNewColor |= gajXlate5to8[iColor & 0x1F]; + iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; return iNewColor; } @@ -195,7 +195,7 @@ EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor) ULONG iNewColor; /* Copy blue */ - iNewColor = gajXlate5to8[iColor & 0x1F]; + iNewColor = gajXlate5to8[iColor & 0x1F] << 16; /* Copy green */ iColor >>= 5; @@ -203,7 +203,7 @@ EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor) /* Copy red */ iColor >>= 5; - iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; + iNewColor |= gajXlate5to8[iColor & 0x1F]; return iNewColor; } @@ -260,7 +260,7 @@ EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor) ULONG iNewColor; /* Copy blue */ - iNewColor = gajXlate5to8[iColor & 0x1F] << 16; + iNewColor = gajXlate5to8[iColor & 0x1F]; /* Copy green */ iColor >>= 5; @@ -268,7 +268,7 @@ EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor) /* Copy red */ iColor >>= 6; - iNewColor |= gajXlate5to8[iColor & 0x1F]; + iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; return iNewColor; } @@ -280,15 +280,15 @@ EXLATEOBJ_iXlate565toBGR(PEXLATEOBJ pexlo, ULONG iColor) ULONG iNewColor; /* Copy blue */ - iNewColor = gajXlate5to8[iColor & 0x1F]; + iNewColor = gajXlate5to8[iColor & 0x1F] << 16; /* Copy green */ iColor >>= 5; iNewColor |= gajXlate6to8[iColor & 0x3F] << 8; - /* Copy blue */ + /* Copy red */ iColor >>= 6; - iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; + iNewColor |= gajXlate5to8[iColor & 0x1F]; return iNewColor; } @@ -603,157 +603,24 @@ EXLATEOBJ_vInitXlateFromDCs( PDC pdcDst) { PSURFACE psurfDst, psurfSrc; - HPALETTE hpalSrc, hpalDst; - PPALETTE ppalSrc, ppalDst, ppalDstDc; - - DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n"); - - /* Do basic init */ - EXLATEOBJ_vInitTrivial(pexlo); psurfDst = pdcDst->dclevel.pSurface; psurfSrc = pdcSrc->dclevel.pSurface; + /* Check for trivial color translation */ if (psurfDst == psurfSrc) { + EXLATEOBJ_vInitTrivial(pexlo); return; } - hpalSrc = psurfSrc->hDIBPalette; - if (!hpalSrc) - hpalSrc = pPrimarySurface->devinfo.hpalDefault; - - ppalSrc = PALETTE_ShareLockPalette(hpalSrc); - if (!ppalSrc) - return; - - hpalDst = psurfDst->hDIBPalette; - if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault; - - ppalDst = PALETTE_ShareLockPalette(hpalDst); - if (!ppalDst) - { - PALETTE_ShareUnlockPalette(ppalSrc); - return; - } - - ppalDstDc = pdcDst->dclevel.ppal; - ASSERT(ppalDstDc); - - /* KB41464 details how to convert between mono and color */ - if (psurfDst->SurfObj.iBitmapFormat == BMF_1BPP) - { - if (psurfSrc->SurfObj.iBitmapFormat != BMF_1BPP) - { - // HACK!! FIXME: 1bpp DDBs should have gpalMono already! - EXLATEOBJ_vInitialize(pexlo, - ppalSrc, - &gpalMono, - pdcSrc->pdcattr->crBackgroundClr, - pdcDst->pdcattr->crBackgroundClr, - pdcDst->pdcattr->crForegroundClr); - } - } - else if (psurfSrc->SurfObj.iBitmapFormat == BMF_1BPP && !psurfSrc->hSecure) - { - // HACK!! FIXME: 1bpp DDBs should have gpalMono already! - EXLATEOBJ_vInitialize(pexlo, - &gpalMono, - ppalDst, - 0, - pdcDst->pdcattr->crBackgroundClr, - pdcDst->pdcattr->crForegroundClr); - } - else - { - EXLATEOBJ_vInitialize(pexlo, ppalSrc, ppalDst, 0, 0, 0); - } - - PALETTE_ShareUnlockPalette(ppalDst); - PALETTE_ShareUnlockPalette(ppalSrc); -} - - -VOID -NTAPI -EXLATEOBJ_vInitBrushXlate( - PEXLATEOBJ pexlo, - BRUSH *pbrush, - SURFACE *psurfDst, - COLORREF crForegroundClr, - COLORREF crBackgroundClr) -{ - HPALETTE hpalDst = NULL; - PPALETTE ppalDst, ppalPattern; - SURFACE *psurfPattern; - - ASSERT(pexlo); - ASSERT(pbrush); - ASSERT(psurfDst); - ASSERT(!(pbrush->flAttrs & (GDIBRUSH_IS_SOLID | GDIBRUSH_IS_NULL))); - - EXLATEOBJ_vInitTrivial(pexlo); - - hpalDst = psurfDst->hDIBPalette; - if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault; - ppalDst = PALETTE_ShareLockPalette(hpalDst); - if (!ppalDst) - { - DPRINT1("No ppalDst!\n"); - return; - } - - psurfPattern = SURFACE_ShareLockSurface(pbrush->hbmPattern); - if (!psurfPattern) - { - PALETTE_ShareUnlockPalette(ppalDst); - return; - } - -#if 0 - if (psurfDst->SurfObj.iBitmapFormat == BMF_1BPP) - { - if (psurfSrc->SurfObj.iBitmapFormat != BMF_1BPP) - { - // HACK!! FIXME: 1bpp DDBs should have gpalMono already! - EXLATEOBJ_vInitialize(pexlo, - ppalSrc, - &gpalMono, - 0, - crBackgroundClr, - crForegroundClr); - } - } - else -#endif - if (psurfPattern->SurfObj.iBitmapFormat == BMF_1BPP && - !(pbrush->flAttrs & GDIBRUSH_IS_DIB)) - { - /* Special case: 1 bpp pattern, not a DIB brush. */ - if (psurfDst->SurfObj.iBitmapFormat != BMF_1BPP) - { - // HACK!! FIXME: 1bpp DDBs should have gpalMono already! - EXLATEOBJ_vInitialize(pexlo, - &gpalMono, - ppalDst, - 0, - crBackgroundClr, - crForegroundClr); - } - } - else - { - /* Default: use the patterns' palette */ - ppalPattern = PALETTE_LockPalette(psurfPattern->hDIBPalette); - if (ppalPattern) - { - EXLATEOBJ_vInitialize(pexlo, &gpalRGB, ppalDst, 0, 0, 0); - PALETTE_UnlockPalette(ppalPattern); - } - } - - PALETTE_ShareUnlockPalette(ppalDst); - SURFACE_ShareUnlockSurface(psurfPattern); + /* Normal initialisation. No surface means DEFAULT_BITMAP */ + EXLATEOBJ_vInitialize(pexlo, + psurfSrc ? psurfSrc->ppal : &gpalMono, + psurfDst ? psurfDst->ppal : &gpalMono, + pdcSrc->pdcattr->crBackgroundClr, + pdcDst->pdcattr->crBackgroundClr, + pdcDst->pdcattr->crForegroundClr); } VOID