diff --git a/subsystems/win32/win32k/eng/engbrush.c b/subsystems/win32/win32k/eng/engbrush.c index 3c3d1d7b151..08662c91286 100644 --- a/subsystems/win32/win32k/eng/engbrush.c +++ b/subsystems/win32/win32k/eng/engbrush.c @@ -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; diff --git a/subsystems/win32/win32k/eng/pdevobj.c b/subsystems/win32/win32k/eng/pdevobj.c index 3c91554d9ef..9ca4311a604 100644 --- a/subsystems/win32/win32k/eng/pdevobj.c +++ b/subsystems/win32/win32k/eng/pdevobj.c @@ -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; diff --git a/subsystems/win32/win32k/eng/surface.c b/subsystems/win32/win32k/eng/surface.c index e60e80c8ba0..bb0f1342f50 100644 --- a/subsystems/win32/win32k/eng/surface.c +++ b/subsystems/win32/win32k/eng/surface.c @@ -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; diff --git a/subsystems/win32/win32k/eng/xlate.c b/subsystems/win32/win32k/eng/xlate.c index 27d06846fe8..e472798ef50 100644 --- a/subsystems/win32/win32k/eng/xlate.c +++ b/subsystems/win32/win32k/eng/xlate.c @@ -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"); diff --git a/subsystems/win32/win32k/include/pdevobj.h b/subsystems/win32/win32k/include/pdevobj.h index 076e8d8d3dc..6a19a1bffec 100644 --- a/subsystems/win32/win32k/include/pdevobj.h +++ b/subsystems/win32/win32k/include/pdevobj.h @@ -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. */ diff --git a/subsystems/win32/win32k/objects/bitblt.c b/subsystems/win32/win32k/objects/bitblt.c index 5d0cdaf0d2a..c2261fc0082 100644 --- a/subsystems/win32/win32k/objects/bitblt.c +++ b/subsystems/win32/win32k/objects/bitblt.c @@ -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; + if (BitmapSrc->hDIBPalette) + PalSourceGDI = PALETTE_ShareLockPalette(BitmapSrc->hDIBPalette); + else if (BitmapSrc->ppal) + { + GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject); + PalSourceGDI = BitmapSrc->ppal ; + } + else + PalSourceGDI = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault) ; - SourcePalette = BitmapSrc->hDIBPalette; - if (!SourcePalette) SourcePalette = pPrimarySurface->devinfo.hpalDefault; - - if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette))) + if(!PalSourceGDI) { 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); - } - else - { - PalDestMode = PalSrcMode; - PalDestGDI = PalSourceGDI; - } /* 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, diff --git a/subsystems/win32/win32k/objects/bitmaps.c b/subsystems/win32/win32k/objects/bitmaps.c index e24bcb2cf4f..c4bb3857cc8 100644 --- a/subsystems/win32/win32k/objects/bitmaps.c +++ b/subsystems/win32/win32k/objects/bitmaps.c @@ -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) { diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index 99c6967d3e0..c27d08b60e2 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -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 if (bitmap->ppal) + { + ppalDDB = bitmap->ppal; + GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject); } else - { // Destination palette obtained from the hDC - DDB_Palette = DC->ppdev->devinfo.hpalDefault; - } + 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,19 +663,31 @@ NtGdiGetDIBitsInternal( DC_UnlockDc(Dc); return 0; } - DC_UnlockDc(Dc); /* Get a pointer to the source bitmap object */ psurf = SURFACE_LockSurface(hBitmap); if (psurf == NULL) - return 0; - - hSourcePalette = psurf->hDIBPalette; - if (!hSourcePalette) { - hSourcePalette = pPrimarySurface->devinfo.hpalDefault; + DC_UnlockDc(Dc); + return 0; } + if (psurf->hDIBPalette) + { + 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); diff --git a/subsystems/win32/win32k/objects/fillshap.c b/subsystems/win32/win32k/objects/fillshap.c index bf5e7aa0a20..49ca4ce5213 100644 --- a/subsystems/win32/win32k/objects/fillshap.c +++ b/subsystems/win32/win32k/objects/fillshap.c @@ -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); diff --git a/subsystems/win32/win32k/objects/freetype.c b/subsystems/win32/win32k/objects/freetype.c index b5b88b525a4..5cceadfa4fe 100644 --- a/subsystems/win32/win32k/objects/freetype.c +++ b/subsystems/win32/win32k/objects/freetype.c @@ -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) ;