Author: tkreuzer Date: Sun Jul 1 13:43:33 2012 New Revision: 56816
URL: http://svn.reactos.org/svn/reactos?rev=56816&view=rev Log: [WIN32K] - Implement SURFACE_vSetPalette and use it everywhere to set the palette for a surface. Make SURFACE::ppal const, so noone accidentally modifies it without properly handling the references.
Modified: trunk/reactos/win32ss/gdi/eng/surface.c trunk/reactos/win32ss/gdi/eng/surface.h trunk/reactos/win32ss/gdi/ntgdi/bitmaps.c trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
Modified: trunk/reactos/win32ss/gdi/eng/surface.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/eng/surface.c?r... ============================================================================== --- trunk/reactos/win32ss/gdi/eng/surface.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/eng/surface.c [iso-8859-1] Sun Jul 1 13:43:33 2012 @@ -267,8 +267,7 @@ }
/* Assign a default palette and increment its reference count */ - psurf->ppal = appalSurfaceDefault[iFormat]; - GDIOBJ_vReferenceObjectByPointer(&psurf->ppal->BaseObject); + SURFACE_vSetPalette(psurf, appalSurfaceDefault[iFormat]);
return psurf; } @@ -399,6 +398,7 @@ SURFOBJ *pso; PSURFACE psurf; PDEVOBJ* ppdev; + PPALETTE ppal;
ppdev = (PDEVOBJ*)hdev;
@@ -418,8 +418,10 @@ psurf->flags &= ~HOOK_FLAGS; psurf->flags |= (flHooks & HOOK_FLAGS);
- /* Get palette */ - psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); + /* Assign the PDEV's palette */ + ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); + SURFACE_vSetPalette(psurf, ppal); + PALETTE_ShareUnlockPalette(ppal);
SURFACE_ShareUnlockSurface(psurf);
@@ -441,6 +443,7 @@ SURFOBJ *pso; PSURFACE psurf; PDEVOBJ* ppdev; + PPALETTE ppal;
psurf = SURFACE_ShareLockSurface(hsurf); if (psurf == NULL) @@ -462,8 +465,10 @@ psurf->flags &= ~HOOK_FLAGS; psurf->flags |= (flHooks & HOOK_FLAGS);
- /* Get palette */ - psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); + /* Assign the PDEV's palette */ + ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); + SURFACE_vSetPalette(psurf, ppal); + PALETTE_ShareUnlockPalette(ppal);
SURFACE_ShareUnlockSurface(psurf);
Modified: trunk/reactos/win32ss/gdi/eng/surface.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/eng/surface.h?r... ============================================================================== --- trunk/reactos/win32ss/gdi/eng/surface.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/eng/surface.h [iso-8859-1] Sun Jul 1 13:43:33 2012 @@ -10,7 +10,7 @@ SURFOBJ SurfObj; //XDCOBJ * pdcoAA; FLONG flags; - struct _PALETTE *ppal; + struct _PALETTE * const ppal; // Use SURFACE_vSetPalette to assign a palette //UINT unk_050;
union @@ -123,3 +123,17 @@ _In_ ULONG fjBitmap, _In_opt_ ULONG cjWidth, _In_opt_ PVOID pvBits); + +VOID +FORCEINLINE +SURFACE_vSetPalette( + _Inout_ PSURFACE psurf, + _In_ PPALETTE ppal) +{ + if (psurf->ppal) + GDIOBJ_vDereferenceObject((POBJ)psurf->ppal); + if (ppal) + GDIOBJ_vReferenceObjectByPointer((POBJ)ppal); + *(PVOID*)&psurf->ppal = ppal; +} +
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitmaps.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/bitmaps.c... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/bitmaps.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/bitmaps.c [iso-8859-1] Sun Jul 1 13:43:33 2012 @@ -223,6 +223,7 @@ INT Height) { HBITMAP Bmp = NULL; + PPALETTE ppal;
/* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ if (0 == Width || 0 == Height) @@ -241,8 +242,13 @@ NULL); psurf = SURFACE_ShareLockSurface(Bmp); ASSERT(psurf); - /* Set palette */ - psurf->ppal = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault); + + /* Dereference old palette and set new palette */ + ppal = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault); + ASSERT(ppal); + SURFACE_vSetPalette(psurf, ppal); + PALETTE_ShareUnlockPalette(ppal); + /* Set flags */ psurf->flags = API_BITMAP; psurf->hdc = NULL; // FIXME: @@ -266,9 +272,10 @@ NULL); psurfBmp = SURFACE_ShareLockSurface(Bmp); ASSERT(psurfBmp); - /* Assign palette */ - psurfBmp->ppal = psurf->ppal; - GDIOBJ_vReferenceObjectByPointer((POBJ)psurf->ppal); + + /* Dereference old palette and set new palette */ + SURFACE_vSetPalette(psurfBmp, psurf->ppal); + /* Set flags */ psurfBmp->flags = API_BITMAP; psurfBmp->hdc = NULL; // FIXME: @@ -622,12 +629,9 @@ psurfSrc->SurfObj.pvBits, psurfNew->SurfObj.cjBits);
- /* Dereference the new bitmaps palette, we will use a different */ - GDIOBJ_vDereferenceObject(&psurfNew->ppal->BaseObject);
/* Reference the palette of the source bitmap and use it */ - GDIOBJ_vReferenceObjectByPointer(&psurfSrc->ppal->BaseObject); - psurfNew->ppal = psurfSrc->ppal; + SURFACE_vSetPalette(psurfNew, psurfSrc->ppal);
/* Unlock the new surface */ SURFACE_ShareUnlockSurface(psurfNew);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c?... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Sun Jul 1 13:43:33 2012 @@ -1599,8 +1599,8 @@ ppalDIB = CreateDIBPalette(bmi, dc, usage); if (ppalDIB) { - if (bmp->ppal) PALETTE_ShareUnlockPalette(bmp->ppal); - bmp->ppal = ppalDIB; + SURFACE_vSetPalette(bmp, ppalDIB); + PALETTE_ShareUnlockPalette(ppalDIB); }
// Clean up in case of errors