[WIN32K]
[reactos.git] / subsystems / win32 / win32k / eng / xlate.c
index fcdd0b8..a1ec189 100644 (file)
@@ -6,7 +6,7 @@
  * PROGRAMER:        Timo Kreuzer (timo.kreuzer@reactos.org)
  */
 
-#include <w32k.h>
+#include <win32k.h>
 
 #include <intrin.h>
 
@@ -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