Author: khornicek
Date: Sat Nov 21 22:54:17 2009
New Revision: 44263

URL: http://svn.reactos.org/svn/reactos?rev=44263&view=rev
Log:
- palette support for dib sections

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c
    branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/surfobj.c
    branches/arwinss/reactos/subsystems/win32/win32k/include/brushobj.h
    branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c [iso-8859-1] 
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c [iso-8859-1] 
Sat Nov 21 22:54:17 2009
@@ -130,6 +130,9 @@
     SIZEL szSize;
     ULONG ulFormat;
     HBITMAP hbmDIB;
+    RGBQUAD *lpRGB = NULL;
+    PDC pDC;
+    SURFACE *dibSurf;
 
     /* Get DIB section size */
     szSize.cx = dib->dsBm.bmWidth;
@@ -145,6 +148,52 @@
                              BMF_DONTCACHE | BMF_USERMEM | BMF_NOZEROINIT |
                              0,
                              dib->dsBm.bmBits);
+
+    dib->dsBmih.biClrUsed = 0;
+    /* set number of entries in bmi.bmiColors table */
+    if (dib->dsBmih.biBitCount == 1)
+    {
+        dib->dsBmih.biClrUsed = 2;
+    }
+    else if (dib->dsBmih.biBitCount == 4)
+    {
+        dib->dsBmih.biClrUsed = 16;
+    }
+    else if (dib->dsBmih.biBitCount == 8)
+    {
+        dib->dsBmih.biClrUsed = 256;
+    }
+
+    dibSurf = SURFACE_Lock(hbmDIB);
+
+    if (dib->dsBmih.biClrUsed != 0)
+    {
+        if (usage == DIB_PAL_COLORS)
+        {
+            pDC = DC_Lock(physDev);
+            lpRGB = DIB_MapPaletteColors(pDC, bmi);
+            DC_Unlock(pDC);
+            dibSurf->hDIBPalette = 
PALETTE_AllocPaletteIndexedRGB(dib->dsBmih.biClrUsed, lpRGB);
+        }
+        else
+        {
+            dibSurf->hDIBPalette = 
PALETTE_AllocPaletteIndexedRGB(dib->dsBmih.biClrUsed, bmi->bmiColors);
+        }
+    }
+    else
+    {
+        dibSurf->hDIBPalette = PALETTE_AllocPalette(PAL_BITFIELDS, 0, NULL,
+                                                    dib->dsBitfields[0],
+                                                    dib->dsBitfields[1],
+                                                    dib->dsBitfields[2]);
+    }
+
+    SURFACE_Unlock(dibSurf);
+
+    if (lpRGB)
+    {
+        ExFreePoolWithTag(lpRGB, TAG_COLORMAP);
+    }
 
     /* Map handles */
     GDI_AddHandleMapping(hbmDIB, hbitmap);

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] 
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] Sat 
Nov 21 22:54:17 2009
@@ -303,7 +303,7 @@
 
     case BS_SOLID:
         DPRINT("BS_SOLID\n" );
-        pDC->pFillBrush = GreCreateSolidBrush(pLogBrush->lbColor);
+        pDC->pFillBrush = GreCreateSolidBrush(pDC->pBitmap->hDIBPalette, 
pLogBrush->lbColor);
         break;
 
     case BS_HATCHED:

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c 
[iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c 
[iso-8859-1] Sat Nov 21 22:54:17 2009
@@ -187,7 +187,7 @@
 
 PBRUSHGDI
 NTAPI
-GreCreateSolidBrush(COLORREF crColor)
+GreCreateSolidBrush(HPALETTE hDIBPalette, COLORREF crColor)
 {
     PBRUSHGDI pBrush;
     XLATEOBJ *pXlate;
@@ -201,8 +201,11 @@
     pBrush->flAttrs |= GDIBRUSH_IS_SOLID;
 
     /* Set color */
-    // FIXME: Take hDIBPalette in account if it exists!
-    hPalette = pPrimarySurface->DevInfo.hpalDefault;
+    if(hDIBPalette)
+        hPalette = hDIBPalette;
+    else
+        hPalette = pPrimarySurface->DevInfo.hpalDefault;
+
     pXlate = IntEngCreateXlate(0, PAL_RGB, hPalette, NULL);
     pBrush->BrushObj.iSolidColor = XLATEOBJ_iXlate(pXlate, crColor);
     EngDeleteXlate(pXlate);

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/surfobj.c
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/surfobj.c?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/surfobj.c [iso-8859-1] 
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/surfobj.c [iso-8859-1] 
Sat Nov 21 22:54:17 2009
@@ -333,7 +333,7 @@
     PBRUSHGDI pOldBrush = pDC->pFillBrush;
 
     /* Create a solid brush with this color */
-    pDC->pFillBrush = GreCreateSolidBrush(crColor);
+    pDC->pFillBrush = GreCreateSolidBrush(pDC->pBitmap->hDIBPalette, crColor);
 
     /* Put pixel */
     GrePatBlt(pDC, x, y, 1, 1, PATCOPY, pDC->pFillBrush);

Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/brushobj.h
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/brushobj.h?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/brushobj.h 
[iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/brushobj.h 
[iso-8859-1] Sat Nov 21 22:54:17 2009
@@ -60,7 +60,7 @@
 GreCreateHatchedBrush(INT iHatchStyle, COLORREF crColor);
 
 PBRUSHGDI NTAPI
-GreCreateSolidBrush(COLORREF crColor);
+GreCreateSolidBrush(HPALETTE hDIBPalette, COLORREF crColor);
 
 PBRUSHGDI NTAPI
 GreCreatePatternBrush(HBITMAP hbmPattern);

Modified: branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c
URL: 
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c?rev=44263&r1=44262&r2=44263&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c [iso-8859-1] 
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/swm/winman.c [iso-8859-1] 
Sat Nov 21 22:54:17 2009
@@ -878,7 +878,7 @@
     RosGdiCreateDC(&RosDc, &ScreenDc, L"", L"", L"", NULL);
 
     /* Create a pen and select it */
-    Brush = GreCreateSolidBrush(RGB(0xFF, 0, 0));
+    Brush = GreCreateSolidBrush(NULL, RGB(0xFF, 0, 0));
 
     /* Get a pointer to the DC */
     pDC = DC_Lock(ScreenDc);
@@ -897,7 +897,7 @@
 
     /* Clear the area */
     BrushBack = pDC->pFillBrush;
-    pDC->pFillBrush = GreCreateSolidBrush(RGB(0,0,0));
+    pDC->pFillBrush = GreCreateSolidBrush(NULL, RGB(0,0,0));
     GreRectangle(pDC, 0, 0, 800/4, 600/4);
     GreFreeBrush(pDC->pFillBrush);
     pDC->pFillBrush = BrushBack;


Reply via email to