[WIN32K]
authorJérôme Gardou <jerome.gardou@reactos.org>
Sat, 8 May 2010 22:10:41 +0000 (22:10 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Sat, 8 May 2010 22:10:41 +0000 (22:10 +0000)
  - attach devinfo->hpalDefault to the pdevobj after enabling it
  - attach this palette to surfaces attached to this pdevobj through EngModifySurface
  - use this palette in several place
Partially fixes icon drawing after mode switch

svn path=/branches/reactos-yarotows/; revision=47137

subsystems/win32/win32k/eng/engbrush.c
subsystems/win32/win32k/eng/pdevobj.c
subsystems/win32/win32k/eng/surface.c
subsystems/win32/win32k/eng/xlate.c
subsystems/win32/win32k/include/pdevobj.h
subsystems/win32/win32k/objects/bitblt.c
subsystems/win32/win32k/objects/bitmaps.c
subsystems/win32/win32k/objects/dibobj.c
subsystems/win32/win32k/objects/fillshap.c
subsystems/win32/win32k/objects/freetype.c

index 3c3d1d7..08662c9 100644 (file)
@@ -18,8 +18,6 @@ VOID
 NTAPI
 EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
 {
-    HPALETTE hpal = NULL;
-
     ASSERT(pebo);
     ASSERT(pbrush);
     ASSERT(pdc);
@@ -35,12 +33,20 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
     pebo->crCurrentText = pdc->pdcattr->crForegroundClr;
 
     pebo->psurfTrg = pdc->dclevel.pSurface;
-//    ASSERT(pebo->psurfTrg); // FIXME: some dcs don't have a surface
+    ASSERT(pebo->psurfTrg);
+
+    if (pebo->psurfTrg->hDIBPalette)
+    {
+        pebo->ppalSurf = PALETTE_ShareLockPalette(pebo->psurfTrg->hDIBPalette);
+    }
+    else if (pebo->psurfTrg->ppal)
+    {
+        pebo->ppalSurf = pebo->psurfTrg->ppal;
+        GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject);
+    }
+    else
+        pebo->ppalSurf = PALETTE_ShareLockPalette(pdc->ppdev->devinfo.hpalDefault);
 
-    if (pebo->psurfTrg)
-        hpal = pebo->psurfTrg->hDIBPalette;
-    if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
-    pebo->ppalSurf = PALETTE_ShareLockPalette(hpal);
     if (!pebo->ppalSurf)
         pebo->ppalSurf = &gpalRGB;
 
index 3c91554..9ca4311 100644 (file)
@@ -65,6 +65,12 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
             ppdev->pfn.DisableSurface(ppdev->dhpdev);
         }
 
+        /* Do we have a palette? */
+        if(ppdev->ppalSurf)
+        {
+            PALETTE_ShareUnlockPalette(ppdev->ppalSurf);
+        }
+
         /* Disable PDEV */
         ppdev->pfn.DisablePDEV(ppdev->dhpdev);
 
@@ -133,6 +139,10 @@ PDEVOBJ_bEnablePDEV(
     if (ppdev->gdiinfo.ulLogPixelsY == 0)
         ppdev->gdiinfo.ulLogPixelsY = 96;
 
+    /* Setup Palette */
+    GDIOBJ_SetOwnership(ppdev->devinfo.hpalDefault, NULL);
+    ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
+
     DPRINT1("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
 
     return TRUE;
index e60e80c..bb0f134 100644 (file)
@@ -136,6 +136,12 @@ SURFACE_Cleanup(PVOID ObjectBody)
         }
     }
 
+    /* Free palette */
+    if(psurf->ppal)
+    {
+        PALETTE_ShareUnlockPalette(psurf->ppal);
+    }
+
     return TRUE;
 }
 
@@ -731,6 +737,9 @@ EngAssociateSurface(
     /* Hook up specified functions */
     psurf->flHooks = flHooks;
 
+    /* Get palette */
+    psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
+
     SURFACE_UnlockSurface(psurf);
 
     return TRUE;
@@ -773,6 +782,9 @@ EngModifySurface(
     /* Hook up specified functions */
     psurf->flHooks = flHooks;
 
+    /* Get palette */
+    psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
+
     SURFACE_UnlockSurface(psurf);
 
     return TRUE;
index 27d0684..e472798 100644 (file)
@@ -603,7 +603,6 @@ EXLATEOBJ_vInitXlateFromDCs(
     PDC pdcDst)
 {
     PSURFACE psurfDst, psurfSrc;
-    HPALETTE hpalSrc, hpalDst;
     PPALETTE ppalSrc, ppalDst, ppalDstDc;
 
     DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n");
@@ -619,18 +618,33 @@ EXLATEOBJ_vInitXlateFromDCs(
         return;
     }
 
-    hpalSrc = psurfSrc->hDIBPalette;
-    if (!hpalSrc) 
-        hpalSrc = pPrimarySurface->devinfo.hpalDefault;
+    if (psurfSrc->hDIBPalette)
+    {
+        ppalSrc = PALETTE_ShareLockPalette(psurfSrc->hDIBPalette);
+    }
+    else if (psurfSrc->ppal)
+    {
+        ppalSrc = psurfSrc->ppal;
+        GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
+    }
+    else
+        ppalSrc = PALETTE_ShareLockPalette(pdcSrc->ppdev->devinfo.hpalDefault);
 
-    ppalSrc = PALETTE_ShareLockPalette(hpalSrc);
-    if (!ppalSrc)
+    if(!ppalSrc)
         return;
 
-    hpalDst = psurfDst->hDIBPalette;
-    if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
+    if (psurfDst->hDIBPalette)
+    {
+        ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
+    }
+    else if (psurfDst->ppal)
+    {
+        ppalDst = psurfDst->ppal;
+        GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
+    }
+    else
+        ppalDst = PALETTE_ShareLockPalette(pdcDst->ppdev->devinfo.hpalDefault);
 
-    ppalDst = PALETTE_ShareLockPalette(hpalDst);
     if (!ppalDst)
     {
         PALETTE_ShareUnlockPalette(ppalSrc);
@@ -683,7 +697,6 @@ EXLATEOBJ_vInitBrushXlate(
     COLORREF crForegroundClr,
     COLORREF crBackgroundClr)
 {
-    HPALETTE hpalDst = NULL;
     PPALETTE ppalDst, ppalPattern;
     SURFACE *psurfPattern;
 
@@ -694,9 +707,18 @@ EXLATEOBJ_vInitBrushXlate(
 
     EXLATEOBJ_vInitTrivial(pexlo);
 
-    hpalDst = psurfDst->hDIBPalette;
-    if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
-    ppalDst = PALETTE_ShareLockPalette(hpalDst);
+    if (psurfDst->hDIBPalette)
+    {
+        ppalDst = PALETTE_ShareLockPalette(psurfDst->hDIBPalette);
+    }
+    else if (psurfDst->ppal)
+    {
+        ppalDst = psurfDst->ppal;
+        GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
+    }
+    else
+        ppalDst = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault);
+
     if (!ppalDst)
     {
         DPRINT1("No ppalDst!\n");
index 076e8d8..6a19a1b 100644 (file)
@@ -116,7 +116,7 @@ typedef struct _PDEVOBJ
 //  ULONG                     TagSig;
     struct _LDEVOBJ *         pldev;
     DHPDEV                    dhpdev;         /* DHPDEV for device. */
-    PVOID                     ppalSurf;       /* PEPALOBJ/PPALETTE for this device. */
+    struct _PALETTE*          ppalSurf;       /* PEPALOBJ/PPALETTE for this device. */
     DEVINFO                   devinfo;
     GDIINFO                   gdiinfo;
     PSURFACE                  pSurface;       /* SURFACE for this device. */
index 5d0cdaf..c2261fc 100644 (file)
@@ -328,9 +328,7 @@ NtGdiTransparentBlt(
     PGDIOBJ apObj[2];
     RECTL rcDest, rcSrc;
     SURFACE *BitmapDest, *BitmapSrc = NULL;
-    HPALETTE SourcePalette = 0, DestPalette = 0;
-    PPALETTE PalDestGDI, PalSourceGDI;
-    USHORT PalDestMode, PalSrcMode;
+    PPALETTE PalSourceGDI;
     ULONG TransparentColor = 0;
     BOOL Ret = FALSE;
     EXLATEOBJ exlo;
@@ -396,42 +394,29 @@ NtGdiTransparentBlt(
         goto done;
     }
 
-    DestPalette = BitmapDest->hDIBPalette;
-    if (!DestPalette) DestPalette = pPrimarySurface->devinfo.hpalDefault;
-
-    SourcePalette = BitmapSrc->hDIBPalette;
-    if (!SourcePalette) SourcePalette = pPrimarySurface->devinfo.hpalDefault;
-
-    if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette)))
+    if (BitmapSrc->hDIBPalette)
+        PalSourceGDI = PALETTE_ShareLockPalette(BitmapSrc->hDIBPalette);
+    else if (BitmapSrc->ppal)
     {
-        SetLastWin32Error(ERROR_INVALID_HANDLE);
-        goto done;
-    }
-    PalSrcMode = PalSourceGDI->Mode;
-    PALETTE_UnlockPalette(PalSourceGDI);
-
-    if(DestPalette != SourcePalette)
-    {
-        if (!(PalDestGDI = PALETTE_LockPalette(DestPalette)))
-        {
-            SetLastWin32Error(ERROR_INVALID_HANDLE);
-            goto done;
-        }
-        PalDestMode = PalDestGDI->Mode;
-        PALETTE_UnlockPalette(PalDestGDI);
+        GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject);
+        PalSourceGDI = BitmapSrc->ppal ;
     }
     else
+        PalSourceGDI = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault) ;
+
+    if(!PalSourceGDI)
     {
-        PalDestMode = PalSrcMode;
-        PalDestGDI = PalSourceGDI;
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        goto done;
     }
 
     /* Translate Transparent (RGB) Color to the source palette */
     EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalSourceGDI, 0, 0, 0);
     TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor);
     EXLATEOBJ_vCleanup(&exlo);
+    PALETTE_ShareUnlockPalette(PalSourceGDI);
 
-    EXLATEOBJ_vInitialize(&exlo, PalSourceGDI, PalDestGDI, 0, 0, 0);
+    EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest);
 
     Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
         DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc,
index e24bcb2..c4bb385 100644 (file)
@@ -143,11 +143,23 @@ IntCreateCompatibleBitmap(
     {
         if (Dc->dctype != DC_TYPE_MEMORY)
         {
+            PSURFACE psurf;
             Bmp = IntGdiCreateBitmap(abs(Width),
                                      abs(Height),
                                      Dc->ppdev->gdiinfo.cPlanes,
                                      Dc->ppdev->gdiinfo.cBitsPixel,
                                      NULL);
+            /* Set palette */
+            psurf = SURFACE_LockSurface(Bmp);
+            if(!psurf)
+            {
+                DPRINT1("Could not lock surface?\n");
+            }
+            else
+            {
+                psurf->ppal = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault);
+                SURFACE_UnlockSurface(psurf);
+            }
         }
         else
         {
@@ -334,7 +346,6 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
     BOOL bInRect = FALSE;
     SURFACE *psurf;
     SURFOBJ *pso;
-    HPALETTE hpal = 0;
     PPALETTE ppal;
     EXLATEOBJ exlo;
     HBITMAP hBmpTmp;
@@ -362,9 +373,15 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
         if (psurf)
         {
             pso = &psurf->SurfObj;
-            hpal = psurf->hDIBPalette;
-            if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
-            ppal = PALETTE_ShareLockPalette(hpal);
+            if(psurf->hDIBPalette)
+                ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
+            else if (psurf->ppal)
+            {
+                ppal = psurf->ppal;
+                GDIOBJ_IncrementShareCount(&ppal->BaseObject);
+            }
+            else
+                ppal = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
 
             if (psurf->SurfObj.iBitmapFormat == BMF_1BPP && !psurf->hSecure)
             {
index 99c6967..c27d08b 100644 (file)
@@ -230,7 +230,7 @@ IntSetDIBits(
     EXLATEOBJ   exlo;
     PPALETTE    ppalDDB, ppalDIB;
     //RGBQUAD    *lpRGB;
-    HPALETTE    DDB_Palette, DIB_Palette;
+    HPALETTE    DIB_Palette;
     ULONG       DIB_Palette_Type;
     INT         DIBWidth;
 
@@ -279,15 +279,17 @@ IntSetDIBits(
     // Use hDIBPalette if it exists
     if (bitmap->hDIBPalette)
     {
-        DDB_Palette = bitmap->hDIBPalette;
+        ppalDDB = PALETTE_ShareLockPalette(bitmap->hDIBPalette);
     }
-    else
+    else if (bitmap->ppal)
     {
-        // Destination palette obtained from the hDC
-        DDB_Palette = DC->ppdev->devinfo.hpalDefault;
+        ppalDDB = bitmap->ppal;
+        GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
     }
+    else
+        // Destination palette obtained from the hDC
+        ppalDDB = PALETTE_ShareLockPalette(DC->ppdev->devinfo.hpalDefault);
 
-    ppalDDB = PALETTE_LockPalette(DDB_Palette);
     if (NULL == ppalDDB)
     {
         EngUnlockSurface(SourceSurf);
@@ -304,6 +306,7 @@ IntSetDIBits(
         EngUnlockSurface(SourceSurf);
         EngDeleteSurface((HSURF)SourceBitmap);
         SURFACE_UnlockSurface(bitmap);
+        PALETTE_ShareUnlockPalette(ppalDDB);
         SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
         return 0;
     }
@@ -336,7 +339,7 @@ IntSetDIBits(
     // Clean up
     EXLATEOBJ_vCleanup(&exlo);
     PALETTE_UnlockPalette(ppalDIB);
-    PALETTE_UnlockPalette(ppalDDB);
+    PALETTE_ShareUnlockPalette(ppalDDB);
     PALETTE_FreePaletteByHandle(DIB_Palette);
     EngUnlockSurface(SourceSurf);
     EngDeleteSurface((HSURF)SourceBitmap);
@@ -441,7 +444,7 @@ NtGdiSetDIBitsToDeviceInternal(
     SIZEL SourceSize;
     EXLATEOBJ exlo;
     PPALETTE ppalDDB = NULL, ppalDIB = NULL;
-    HPALETTE hpalDDB, hpalDIB = NULL;
+    HPALETTE hpalDIB = NULL;
     ULONG DIBPaletteType;
 
     if (!Bits) return 0;
@@ -474,15 +477,7 @@ NtGdiSetDIBitsToDeviceInternal(
         return 0;
     }
 
-    /* Use destination palette obtained from the DC by default */
-    hpalDDB = pDC->ppdev->devinfo.hpalDefault;
-
-    /* Try to use hDIBPalette if it exists */
     pSurf = pDC->dclevel.pSurface;
-    if (pSurf && pSurf->hDIBPalette)
-    {
-        hpalDDB = pSurf->hDIBPalette;
-    }
 
     pDestSurf = pSurf ? &pSurf->SurfObj : NULL;
 
@@ -528,7 +523,18 @@ NtGdiSetDIBitsToDeviceInternal(
     }
 
     /* Obtain destination palette */
-    ppalDDB = PALETTE_LockPalette(hpalDDB);
+    if (pSurf && pSurf->hDIBPalette)
+    {
+        ppalDDB = PALETTE_ShareLockPalette(pSurf->hDIBPalette);
+    }
+    else if (pSurf && pSurf->ppal)
+    {
+        ppalDDB = pSurf->ppal;
+        GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
+    }
+    else
+        ppalDDB = PALETTE_ShareLockPalette(pDC->ppdev->devinfo.hpalDefault);
+
     if (!ppalDDB)
     {
         SetLastWin32Error(ERROR_INVALID_HANDLE);
@@ -547,7 +553,7 @@ NtGdiSetDIBitsToDeviceInternal(
 
     /* Lock the DIB palette */
     ppalDIB = PALETTE_LockPalette(hpalDIB);
-    if (!ppalDDB)
+    if (!ppalDIB)
     {
         SetLastWin32Error(ERROR_INVALID_HANDLE);
         Status = STATUS_UNSUCCESSFUL;
@@ -558,7 +564,7 @@ NtGdiSetDIBitsToDeviceInternal(
     EXLATEOBJ_vInitialize(&exlo, ppalDIB, ppalDDB, 0, 0, 0);
 
     /* Copy the bits */
-    DPRINT("BitsToDev with dstsurf=(%d|%d) (%d|%d), src=(%d|%d) w=%d h=%d\n", 
+    DPRINT("BitsToDev with dstsurf=(%d|%d) (%d|%d), src=(%d|%d) w=%d h=%d\n",
         rcDest.left, rcDest.top, rcDest.right, rcDest.bottom,
         ptSource.x, ptSource.y, SourceSize.cx, SourceSize.cy);
     Status = IntEngBitBlt(pDestSurf,
@@ -583,7 +589,7 @@ Exit:
     }
 
     if (ppalDIB) PALETTE_UnlockPalette(ppalDIB);
-    if (ppalDDB) PALETTE_UnlockPalette(ppalDDB);
+    if (ppalDDB) PALETTE_ShareUnlockPalette(ppalDDB);
 
     if (pSourceSurf) EngUnlockSurface(pSourceSurf);
     if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap);
@@ -611,7 +617,6 @@ NtGdiGetDIBitsInternal(
     PDC Dc;
     SURFACE *psurf = NULL;
     HBITMAP hDestBitmap = NULL;
-    HPALETTE hSourcePalette = NULL;
     HPALETTE hDestPalette = NULL;
     PPALETTE ppalSrc = NULL;
     PPALETTE ppalDst = NULL;
@@ -636,7 +641,7 @@ NtGdiGetDIBitsInternal(
     _SEH2_TRY
     {
         ProbeForRead(&Info->bmiHeader.biSize, sizeof(DWORD), 1);
-        
+
         ProbeForWrite(Info, Info->bmiHeader.biSize, 1); // Comp for Core.
         if (ChkBits) ProbeForWrite(ChkBits, MaxBits, 1);
     }
@@ -658,18 +663,30 @@ NtGdiGetDIBitsInternal(
         DC_UnlockDc(Dc);
         return 0;
     }
-    DC_UnlockDc(Dc);
 
     /* Get a pointer to the source bitmap object */
     psurf = SURFACE_LockSurface(hBitmap);
     if (psurf == NULL)
+    {
+        DC_UnlockDc(Dc);
         return 0;
+    }
 
-    hSourcePalette = psurf->hDIBPalette;
-    if (!hSourcePalette)
+    if (psurf->hDIBPalette)
     {
-        hSourcePalette = pPrimarySurface->devinfo.hpalDefault;
+        ppalSrc = PALETTE_ShareLockPalette(psurf->hDIBPalette);
     }
+    else if (psurf->ppal)
+    {
+        ppalSrc = psurf->ppal;
+        GDIOBJ_IncrementShareCount(&ppalSrc->BaseObject);
+    }
+    else
+        ppalSrc = PALETTE_ShareLockPalette(Dc->ppdev->devinfo.hpalDefault);
+
+    DC_UnlockDc(Dc);
+
+    ASSERT(ppalSrc != NULL);
 
     ColorPtr = ((PBYTE)Info + Info->bmiHeader.biSize);
     rgbQuads = (RGBQUAD *)ColorPtr;
@@ -680,16 +697,12 @@ NtGdiGetDIBitsInternal(
          Info->bmiHeader.biBitCount != 15 && Info->bmiHeader.biBitCount != 16) ||
          !ChkBits)
     {
-        hDestPalette = hSourcePalette;
+        ppalDst = ppalSrc;
         bPaletteMatch = TRUE;
     }
     else
         hDestPalette = BuildDIBPalette(Info, (PINT)&DestPaletteType); //hDestPalette = Dc->DevInfo->hpalDefault;
 
-    ppalSrc = PALETTE_LockPalette(hSourcePalette);
-    /* FIXME - ppalSrc can be NULL!!! Don't assert here! */
-    ASSERT(ppalSrc);
-
     if (!bPaletteMatch)
     {
         ppalDst = PALETTE_LockPalette(hDestPalette);
@@ -697,10 +710,6 @@ NtGdiGetDIBitsInternal(
         DPRINT("ppalDst : %p\n", ppalDst);
         ASSERT(ppalDst);
     }
-    else
-    {
-        ppalDst = ppalSrc;
-    }
 
     /* Copy palette. */
     /* FIXME: This is largely incomplete. ATM no Core!*/
@@ -970,7 +979,7 @@ NtGdiGetDIBitsInternal(
         }
     }
 cleanup:
-    PALETTE_UnlockPalette(ppalSrc);
+    PALETTE_ShareUnlockPalette(ppalSrc);
 
     if (hDestBitmap != NULL)
         EngDeleteSurface((HSURF)hDestBitmap);
index bf5e7aa..49ca4ce 100644 (file)
@@ -872,7 +872,6 @@ IntGdiGradientFill(
     POINTL DitherOrg;
     ULONG i;
     BOOL Ret;
-    HPALETTE hDestPalette;
 
     ASSERT(dc);
     ASSERT(pVertex);
@@ -936,10 +935,19 @@ IntGdiGradientFill(
     /* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */
     ASSERT(psurf);
 
-    hDestPalette = psurf->hDIBPalette;
-    if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault;
+    if (psurf->hDIBPalette)
+    {
+        PalDestGDI = PALETTE_ShareLockPalette(psurf->hDIBPalette);
+    }
+    else if (psurf->ppal)
+    {
+        PalDestGDI = psurf->ppal;
+        GDIOBJ_IncrementShareCount(&PalDestGDI->BaseObject);
+    }
+    else
+        // Destination palette obtained from the hDC
+        PalDestGDI = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
 
-    PalDestGDI = PALETTE_LockPalette(hDestPalette);
     EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalDestGDI, 0, 0, 0);
 
     Ret = IntEngGradientFill(&psurf->SurfObj,
@@ -956,7 +964,7 @@ IntGdiGradientFill(
     EXLATEOBJ_vCleanup(&exlo);
 
     if (PalDestGDI)
-        PALETTE_UnlockPalette(PalDestGDI);
+        PALETTE_ShareUnlockPalette(PalDestGDI);
 
     return Ret;
 }
@@ -1089,7 +1097,6 @@ NtGdiExtFloodFill(
     PDC dc;
     PDC_ATTR   pdcattr;
     SURFACE    *psurf = NULL;
-    HPALETTE   hpal;
     PPALETTE   ppal;
     EXLATEOBJ  exlo;
     BOOL       Ret = FALSE;
@@ -1135,9 +1142,18 @@ NtGdiExtFloodFill(
         goto cleanup;
     }
 
-    hpal = dc->dclevel.pSurface->hDIBPalette;
-    if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
-    ppal = PALETTE_ShareLockPalette(hpal);
+    if (psurf->hDIBPalette)
+    {
+        ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
+    }
+    else if (psurf->ppal)
+    {
+        ppal = psurf->ppal;
+        GDIOBJ_IncrementShareCount(&ppal->BaseObject);
+    }
+    else
+        // Destination palette obtained from the hDC
+        ppal = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
 
     EXLATEOBJ_vInitialize(&exlo, &gpalRGB, ppal, 0, 0xffffff, 0);
 
index b5b88b5..5cceadf 100644 (file)
@@ -3168,7 +3168,6 @@ GreExtTextOutW(
     BOOLEAN Render;
     POINT Start;
     BOOL DoBreak = FALSE;
-    HPALETTE hDestPalette;
     PPALETTE ppalDst;
     USHORT DxShift;
 
@@ -3440,14 +3439,22 @@ GreExtTextOutW(
     SurfObj = &psurf->SurfObj ;
 
     /* Create the xlateobj */
-    hDestPalette = psurf->hDIBPalette;
-    if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault;
-    //if (!hDestPalette) hDestPalette = StockObjects[DEFAULT_PALETTE];//pPrimarySurface->devinfo.hpalDefault;
-    ppalDst = PALETTE_LockPalette(hDestPalette);
+    if (psurf->hDIBPalette)
+    {
+        ppalDst = PALETTE_ShareLockPalette(psurf->hDIBPalette);
+    }
+    else if (psurf->ppal)
+    {
+        ppalDst = psurf->ppal;
+        GDIOBJ_IncrementShareCount(&ppalDst->BaseObject);
+    }
+    else
+        // Destination palette obtained from the hDC
+        ppalDst = PALETTE_ShareLockPalette(dc->ppdev->devinfo.hpalDefault);
     ASSERT(ppalDst);
     EXLATEOBJ_vInitialize(&exloRGB2Dst, &gpalRGB, ppalDst, 0, 0, 0);
     EXLATEOBJ_vInitialize(&exloDst2RGB, ppalDst, &gpalRGB, 0, 0, 0);
-    PALETTE_UnlockPalette(ppalDst);
+    PALETTE_ShareUnlockPalette(ppalDst);
 
     if ((fuOptions & ETO_OPAQUE) && (dc->pdcattr->ulDirty_ & DIRTY_BACKGROUND))
         DC_vUpdateBackgroundBrush(dc) ;