[ros-diffs] [fireball] 40103: Evgeniy Boltik <bstsoft at narod.ru> - Rework 8bit DIB alphablend to do alpha operations in source's palette (32bpp) to obtain much better output quality with lowest possible quality loss. See issue #4291 for more details.

fireball at svn.reactos.org fireball at svn.reactos.org
Thu Mar 19 17:56:10 CET 2009


Author: fireball
Date: Thu Mar 19 19:56:07 2009
New Revision: 40103

URL: http://svn.reactos.org/svn/reactos?rev=40103&view=rev
Log:
Evgeniy Boltik <bstsoft at narod.ru>
- Rework 8bit DIB alphablend to do alpha operations in source's palette (32bpp) to obtain much better output quality with lowest possible quality loss.
See issue #4291 for more details.

Modified:
    trunk/reactos/subsystems/win32/win32k/dib/dib8bpp.c

Modified: trunk/reactos/subsystems/win32/win32k/dib/dib8bpp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/dib/dib8bpp.c?rev=40103&r1=40102&r2=40103&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/dib/dib8bpp.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/dib/dib8bpp.c [iso-8859-1] Thu Mar 19 19:56:07 2009
@@ -372,12 +372,12 @@
    register PUCHAR Dst;
    ULONG DstDelta;
    BLENDFUNCTION BlendFunc;
-   register NICEPIXEL32 DstPixel;
-   register NICEPIXEL32 SrcPixel;
+   register NICEPIXEL32 DstPixel32;
+   register NICEPIXEL32 SrcPixel32;
    register NICEPIXEL16 SrcPixel16;
    UCHAR Alpha, SrcBpp;
-   HPALETTE SrcPalette, DstPalette;
-   XLATEOBJ *SrcTo32Xlate, *DstTo32Xlate, *DstFrom32Xlate;
+   XLATEGDI* XlateGDI;
+   XLATEOBJ* SrcXlateObj;
 
    DPRINT("DIB_8BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
           SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
@@ -408,35 +408,17 @@
       DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
       return FALSE;
    }
-
-   SrcBpp = BitsPerFormat(Source->iBitmapFormat);
-   SrcPalette = IntEngGetXlatePalette(ColorTranslation, XO_SRCPALETTE);
-   if (SrcPalette != 0)
-   {
-      SrcTo32Xlate = IntEngCreateXlate(PAL_RGB, 0, NULL, SrcPalette);
-      if (SrcTo32Xlate == NULL)
-      {
-         DPRINT1("IntEngCreateXlate failed\n");
-         return FALSE;
-      }
-   }
-   else
-   {
-      SrcTo32Xlate = NULL;
-      ASSERT(SrcBpp >= 16);
-   }
-
-   DstPalette = IntEngGetXlatePalette(ColorTranslation, XO_DESTPALETTE);
-   DstTo32Xlate = IntEngCreateXlate(PAL_RGB, 0, NULL, DstPalette);
-   DstFrom32Xlate = IntEngCreateXlate(0, PAL_RGB, DstPalette, NULL);
-   if (DstTo32Xlate == NULL || DstFrom32Xlate == NULL)
-   {
-      if (SrcTo32Xlate != NULL)
-         EngDeleteXlate(SrcTo32Xlate);
-      if (DstTo32Xlate != NULL)
-         EngDeleteXlate(DstTo32Xlate);
-      if (DstFrom32Xlate != NULL)
-         EngDeleteXlate(DstFrom32Xlate);
+   if (!ColorTranslation)
+   {
+      DPRINT1("ColorTranslation must not be NULL!\n");
+      return FALSE;
+   }
+
+   XlateGDI = ObjToGDI(ColorTranslation, XLATE);
+   SrcXlateObj = IntEngCreateXlate(0, 0, XlateGDI->SourcePal, XlateGDI->DestPal);
+
+   if (!SrcXlateObj)
+   {
       DPRINT1("IntEngCreateXlate failed\n");
       return FALSE;
    }
@@ -444,6 +426,7 @@
    Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
                              DestRect->left);
    DstDelta = Dest->lDelta - (DestRect->right - DestRect->left);
+   SrcBpp = BitsPerFormat(Source->iBitmapFormat);
 
    Rows = DestRect->bottom - DestRect->top;
    SrcY = SourceRect->top;
@@ -453,45 +436,37 @@
       SrcX = SourceRect->left;
       while (--Cols >= 0)
       {
-         if (SrcTo32Xlate != NULL)
+         if (SrcBpp <= 16)
          {
-            SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, SrcTo32Xlate);
-         }
-         else if (SrcBpp <= 16)
-         {
-            SrcPixel16.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
-            SrcPixel.col.red = (SrcPixel16.col.red << 3) | (SrcPixel16.col.red >> 2);
-            SrcPixel.col.green = (SrcPixel16.col.green << 2) | (SrcPixel16.col.green >> 4);
-            SrcPixel.col.blue = (SrcPixel16.col.blue << 3) | (SrcPixel16.col.blue >> 2);
+             SrcPixel16.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
+             SrcPixel32.col.red = (SrcPixel16.col.red << 3) | (SrcPixel16.col.red >> 2);
+             SrcPixel32.col.green = (SrcPixel16.col.green << 2) | (SrcPixel16.col.green >> 4);
+             SrcPixel32.col.blue = (SrcPixel16.col.blue << 3) | (SrcPixel16.col.blue >> 2);
          }
          else
          {
-            SrcPixel.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY);
+             SrcPixel32.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY);
          }
-         SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255;
-         SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255;
-         SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255;
-         SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
+         SrcPixel32.col.red = SrcPixel32.col.red * BlendFunc.SourceConstantAlpha / 255;
+         SrcPixel32.col.green = SrcPixel32.col.green * BlendFunc.SourceConstantAlpha / 255;
+         SrcPixel32.col.blue = SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha / 255;
+         SrcPixel32.col.alpha = (SrcBpp == 32) ? (SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
 
          Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
-                 SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha;
-
-         DstPixel.ul = XLATEOBJ_iXlate(DstTo32Xlate, *Dst);
-         DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red);
-         DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green);
-         DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue);
-         *Dst++ = XLATEOBJ_iXlate(DstFrom32Xlate, DstPixel.ul);
+             SrcPixel32.col.alpha : BlendFunc.SourceConstantAlpha;
+
+         DstPixel32.ul = XLATEOBJ_iXlate(SrcXlateObj, *Dst);
+         SrcPixel32.col.red = Clamp8(DstPixel32.col.red * (255 - Alpha) / 255 + SrcPixel32.col.red);
+         SrcPixel32.col.green = Clamp8(DstPixel32.col.green * (255 - Alpha) / 255 + SrcPixel32.col.green);
+         SrcPixel32.col.blue = Clamp8(DstPixel32.col.blue * (255 - Alpha) / 255 +  SrcPixel32.col.blue);
+         *Dst++ = XLATEOBJ_iXlate(ColorTranslation, SrcPixel32.ul);
       }
       Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta);
       SrcY++;
    }
 
-   if (SrcTo32Xlate != NULL)
-      EngDeleteXlate(SrcTo32Xlate);
-   if (DstTo32Xlate != NULL)
-      EngDeleteXlate(DstTo32Xlate);
-   if (DstFrom32Xlate != NULL)
-      EngDeleteXlate(DstFrom32Xlate);
+   if (SrcXlateObj)
+       EngDeleteXlate(SrcXlateObj);
 
    return TRUE;
 }



More information about the Ros-diffs mailing list