- 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
This commit is contained in:
Jérôme Gardou 2010-05-08 22:10:41 +00:00
parent 3d533cb7a2
commit db93f2d307
10 changed files with 190 additions and 106 deletions

View file

@ -18,8 +18,6 @@ VOID
NTAPI NTAPI
EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
{ {
HPALETTE hpal = NULL;
ASSERT(pebo); ASSERT(pebo);
ASSERT(pbrush); ASSERT(pbrush);
ASSERT(pdc); ASSERT(pdc);
@ -35,12 +33,20 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
pebo->crCurrentText = pdc->pdcattr->crForegroundClr; pebo->crCurrentText = pdc->pdcattr->crForegroundClr;
pebo->psurfTrg = pdc->dclevel.pSurface; 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) if (!pebo->ppalSurf)
pebo->ppalSurf = &gpalRGB; pebo->ppalSurf = &gpalRGB;

View file

@ -65,6 +65,12 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
ppdev->pfn.DisableSurface(ppdev->dhpdev); ppdev->pfn.DisableSurface(ppdev->dhpdev);
} }
/* Do we have a palette? */
if(ppdev->ppalSurf)
{
PALETTE_ShareUnlockPalette(ppdev->ppalSurf);
}
/* Disable PDEV */ /* Disable PDEV */
ppdev->pfn.DisablePDEV(ppdev->dhpdev); ppdev->pfn.DisablePDEV(ppdev->dhpdev);
@ -133,6 +139,10 @@ PDEVOBJ_bEnablePDEV(
if (ppdev->gdiinfo.ulLogPixelsY == 0) if (ppdev->gdiinfo.ulLogPixelsY == 0)
ppdev->gdiinfo.ulLogPixelsY = 96; 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); DPRINT1("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
return TRUE; return TRUE;

View file

@ -136,6 +136,12 @@ SURFACE_Cleanup(PVOID ObjectBody)
} }
} }
/* Free palette */
if(psurf->ppal)
{
PALETTE_ShareUnlockPalette(psurf->ppal);
}
return TRUE; return TRUE;
} }
@ -731,6 +737,9 @@ EngAssociateSurface(
/* Hook up specified functions */ /* Hook up specified functions */
psurf->flHooks = flHooks; psurf->flHooks = flHooks;
/* Get palette */
psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
SURFACE_UnlockSurface(psurf); SURFACE_UnlockSurface(psurf);
return TRUE; return TRUE;
@ -773,6 +782,9 @@ EngModifySurface(
/* Hook up specified functions */ /* Hook up specified functions */
psurf->flHooks = flHooks; psurf->flHooks = flHooks;
/* Get palette */
psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
SURFACE_UnlockSurface(psurf); SURFACE_UnlockSurface(psurf);
return TRUE; return TRUE;

View file

@ -603,7 +603,6 @@ EXLATEOBJ_vInitXlateFromDCs(
PDC pdcDst) PDC pdcDst)
{ {
PSURFACE psurfDst, psurfSrc; PSURFACE psurfDst, psurfSrc;
HPALETTE hpalSrc, hpalDst;
PPALETTE ppalSrc, ppalDst, ppalDstDc; PPALETTE ppalSrc, ppalDst, ppalDstDc;
DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n"); DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n");
@ -619,18 +618,33 @@ EXLATEOBJ_vInitXlateFromDCs(
return; return;
} }
hpalSrc = psurfSrc->hDIBPalette; if (psurfSrc->hDIBPalette)
if (!hpalSrc) {
hpalSrc = pPrimarySurface->devinfo.hpalDefault; 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; return;
hpalDst = psurfDst->hDIBPalette; if (psurfDst->hDIBPalette)
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault; {
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) if (!ppalDst)
{ {
PALETTE_ShareUnlockPalette(ppalSrc); PALETTE_ShareUnlockPalette(ppalSrc);
@ -683,7 +697,6 @@ EXLATEOBJ_vInitBrushXlate(
COLORREF crForegroundClr, COLORREF crForegroundClr,
COLORREF crBackgroundClr) COLORREF crBackgroundClr)
{ {
HPALETTE hpalDst = NULL;
PPALETTE ppalDst, ppalPattern; PPALETTE ppalDst, ppalPattern;
SURFACE *psurfPattern; SURFACE *psurfPattern;
@ -694,9 +707,18 @@ EXLATEOBJ_vInitBrushXlate(
EXLATEOBJ_vInitTrivial(pexlo); EXLATEOBJ_vInitTrivial(pexlo);
hpalDst = psurfDst->hDIBPalette; if (psurfDst->hDIBPalette)
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault; {
ppalDst = PALETTE_ShareLockPalette(hpalDst); 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) if (!ppalDst)
{ {
DPRINT1("No ppalDst!\n"); DPRINT1("No ppalDst!\n");

View file

@ -116,7 +116,7 @@ typedef struct _PDEVOBJ
// ULONG TagSig; // ULONG TagSig;
struct _LDEVOBJ * pldev; struct _LDEVOBJ * pldev;
DHPDEV dhpdev; /* DHPDEV for device. */ DHPDEV dhpdev; /* DHPDEV for device. */
PVOID ppalSurf; /* PEPALOBJ/PPALETTE for this device. */ struct _PALETTE* ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
DEVINFO devinfo; DEVINFO devinfo;
GDIINFO gdiinfo; GDIINFO gdiinfo;
PSURFACE pSurface; /* SURFACE for this device. */ PSURFACE pSurface; /* SURFACE for this device. */

View file

@ -328,9 +328,7 @@ NtGdiTransparentBlt(
PGDIOBJ apObj[2]; PGDIOBJ apObj[2];
RECTL rcDest, rcSrc; RECTL rcDest, rcSrc;
SURFACE *BitmapDest, *BitmapSrc = NULL; SURFACE *BitmapDest, *BitmapSrc = NULL;
HPALETTE SourcePalette = 0, DestPalette = 0; PPALETTE PalSourceGDI;
PPALETTE PalDestGDI, PalSourceGDI;
USHORT PalDestMode, PalSrcMode;
ULONG TransparentColor = 0; ULONG TransparentColor = 0;
BOOL Ret = FALSE; BOOL Ret = FALSE;
EXLATEOBJ exlo; EXLATEOBJ exlo;
@ -396,42 +394,29 @@ NtGdiTransparentBlt(
goto done; goto done;
} }
DestPalette = BitmapDest->hDIBPalette; if (BitmapSrc->hDIBPalette)
if (!DestPalette) DestPalette = pPrimarySurface->devinfo.hpalDefault; PalSourceGDI = PALETTE_ShareLockPalette(BitmapSrc->hDIBPalette);
else if (BitmapSrc->ppal)
SourcePalette = BitmapSrc->hDIBPalette;
if (!SourcePalette) SourcePalette = pPrimarySurface->devinfo.hpalDefault;
if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette)))
{ {
SetLastWin32Error(ERROR_INVALID_HANDLE); GDIOBJ_IncrementShareCount(&BitmapSrc->ppal->BaseObject);
goto done; PalSourceGDI = BitmapSrc->ppal ;
}
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 else
PalSourceGDI = PALETTE_ShareLockPalette(pPrimarySurface->devinfo.hpalDefault) ;
if(!PalSourceGDI)
{ {
PalDestMode = PalSrcMode; SetLastWin32Error(ERROR_INVALID_HANDLE);
PalDestGDI = PalSourceGDI; goto done;
} }
/* Translate Transparent (RGB) Color to the source palette */ /* Translate Transparent (RGB) Color to the source palette */
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalSourceGDI, 0, 0, 0); EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalSourceGDI, 0, 0, 0);
TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor); TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor);
EXLATEOBJ_vCleanup(&exlo); 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, Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc, DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc,

View file

@ -143,11 +143,23 @@ IntCreateCompatibleBitmap(
{ {
if (Dc->dctype != DC_TYPE_MEMORY) if (Dc->dctype != DC_TYPE_MEMORY)
{ {
PSURFACE psurf;
Bmp = IntGdiCreateBitmap(abs(Width), Bmp = IntGdiCreateBitmap(abs(Width),
abs(Height), abs(Height),
Dc->ppdev->gdiinfo.cPlanes, Dc->ppdev->gdiinfo.cPlanes,
Dc->ppdev->gdiinfo.cBitsPixel, Dc->ppdev->gdiinfo.cBitsPixel,
NULL); 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 else
{ {
@ -334,7 +346,6 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
BOOL bInRect = FALSE; BOOL bInRect = FALSE;
SURFACE *psurf; SURFACE *psurf;
SURFOBJ *pso; SURFOBJ *pso;
HPALETTE hpal = 0;
PPALETTE ppal; PPALETTE ppal;
EXLATEOBJ exlo; EXLATEOBJ exlo;
HBITMAP hBmpTmp; HBITMAP hBmpTmp;
@ -362,9 +373,15 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
if (psurf) if (psurf)
{ {
pso = &psurf->SurfObj; pso = &psurf->SurfObj;
hpal = psurf->hDIBPalette; if(psurf->hDIBPalette)
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault; ppal = PALETTE_ShareLockPalette(psurf->hDIBPalette);
ppal = PALETTE_ShareLockPalette(hpal); 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) if (psurf->SurfObj.iBitmapFormat == BMF_1BPP && !psurf->hSecure)
{ {

View file

@ -230,7 +230,7 @@ IntSetDIBits(
EXLATEOBJ exlo; EXLATEOBJ exlo;
PPALETTE ppalDDB, ppalDIB; PPALETTE ppalDDB, ppalDIB;
//RGBQUAD *lpRGB; //RGBQUAD *lpRGB;
HPALETTE DDB_Palette, DIB_Palette; HPALETTE DIB_Palette;
ULONG DIB_Palette_Type; ULONG DIB_Palette_Type;
INT DIBWidth; INT DIBWidth;
@ -279,15 +279,17 @@ IntSetDIBits(
// Use hDIBPalette if it exists // Use hDIBPalette if it exists
if (bitmap->hDIBPalette) if (bitmap->hDIBPalette)
{ {
DDB_Palette = bitmap->hDIBPalette; ppalDDB = PALETTE_ShareLockPalette(bitmap->hDIBPalette);
}
else if (bitmap->ppal)
{
ppalDDB = bitmap->ppal;
GDIOBJ_IncrementShareCount(&ppalDDB->BaseObject);
} }
else else
{
// Destination palette obtained from the hDC // 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) if (NULL == ppalDDB)
{ {
EngUnlockSurface(SourceSurf); EngUnlockSurface(SourceSurf);
@ -304,6 +306,7 @@ IntSetDIBits(
EngUnlockSurface(SourceSurf); EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap); EngDeleteSurface((HSURF)SourceBitmap);
SURFACE_UnlockSurface(bitmap); SURFACE_UnlockSurface(bitmap);
PALETTE_ShareUnlockPalette(ppalDDB);
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
return 0; return 0;
} }
@ -336,7 +339,7 @@ IntSetDIBits(
// Clean up // Clean up
EXLATEOBJ_vCleanup(&exlo); EXLATEOBJ_vCleanup(&exlo);
PALETTE_UnlockPalette(ppalDIB); PALETTE_UnlockPalette(ppalDIB);
PALETTE_UnlockPalette(ppalDDB); PALETTE_ShareUnlockPalette(ppalDDB);
PALETTE_FreePaletteByHandle(DIB_Palette); PALETTE_FreePaletteByHandle(DIB_Palette);
EngUnlockSurface(SourceSurf); EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap); EngDeleteSurface((HSURF)SourceBitmap);
@ -441,7 +444,7 @@ NtGdiSetDIBitsToDeviceInternal(
SIZEL SourceSize; SIZEL SourceSize;
EXLATEOBJ exlo; EXLATEOBJ exlo;
PPALETTE ppalDDB = NULL, ppalDIB = NULL; PPALETTE ppalDDB = NULL, ppalDIB = NULL;
HPALETTE hpalDDB, hpalDIB = NULL; HPALETTE hpalDIB = NULL;
ULONG DIBPaletteType; ULONG DIBPaletteType;
if (!Bits) return 0; if (!Bits) return 0;
@ -474,15 +477,7 @@ NtGdiSetDIBitsToDeviceInternal(
return 0; 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; pSurf = pDC->dclevel.pSurface;
if (pSurf && pSurf->hDIBPalette)
{
hpalDDB = pSurf->hDIBPalette;
}
pDestSurf = pSurf ? &pSurf->SurfObj : NULL; pDestSurf = pSurf ? &pSurf->SurfObj : NULL;
@ -528,7 +523,18 @@ NtGdiSetDIBitsToDeviceInternal(
} }
/* Obtain destination palette */ /* 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) if (!ppalDDB)
{ {
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
@ -547,7 +553,7 @@ NtGdiSetDIBitsToDeviceInternal(
/* Lock the DIB palette */ /* Lock the DIB palette */
ppalDIB = PALETTE_LockPalette(hpalDIB); ppalDIB = PALETTE_LockPalette(hpalDIB);
if (!ppalDDB) if (!ppalDIB)
{ {
SetLastWin32Error(ERROR_INVALID_HANDLE); SetLastWin32Error(ERROR_INVALID_HANDLE);
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
@ -583,7 +589,7 @@ Exit:
} }
if (ppalDIB) PALETTE_UnlockPalette(ppalDIB); if (ppalDIB) PALETTE_UnlockPalette(ppalDIB);
if (ppalDDB) PALETTE_UnlockPalette(ppalDDB); if (ppalDDB) PALETTE_ShareUnlockPalette(ppalDDB);
if (pSourceSurf) EngUnlockSurface(pSourceSurf); if (pSourceSurf) EngUnlockSurface(pSourceSurf);
if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap); if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap);
@ -611,7 +617,6 @@ NtGdiGetDIBitsInternal(
PDC Dc; PDC Dc;
SURFACE *psurf = NULL; SURFACE *psurf = NULL;
HBITMAP hDestBitmap = NULL; HBITMAP hDestBitmap = NULL;
HPALETTE hSourcePalette = NULL;
HPALETTE hDestPalette = NULL; HPALETTE hDestPalette = NULL;
PPALETTE ppalSrc = NULL; PPALETTE ppalSrc = NULL;
PPALETTE ppalDst = NULL; PPALETTE ppalDst = NULL;
@ -658,19 +663,31 @@ NtGdiGetDIBitsInternal(
DC_UnlockDc(Dc); DC_UnlockDc(Dc);
return 0; return 0;
} }
DC_UnlockDc(Dc);
/* Get a pointer to the source bitmap object */ /* Get a pointer to the source bitmap object */
psurf = SURFACE_LockSurface(hBitmap); psurf = SURFACE_LockSurface(hBitmap);
if (psurf == NULL) 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); ColorPtr = ((PBYTE)Info + Info->bmiHeader.biSize);
rgbQuads = (RGBQUAD *)ColorPtr; rgbQuads = (RGBQUAD *)ColorPtr;
@ -680,16 +697,12 @@ NtGdiGetDIBitsInternal(
Info->bmiHeader.biBitCount != 15 && Info->bmiHeader.biBitCount != 16) || Info->bmiHeader.biBitCount != 15 && Info->bmiHeader.biBitCount != 16) ||
!ChkBits) !ChkBits)
{ {
hDestPalette = hSourcePalette; ppalDst = ppalSrc;
bPaletteMatch = TRUE; bPaletteMatch = TRUE;
} }
else else
hDestPalette = BuildDIBPalette(Info, (PINT)&DestPaletteType); //hDestPalette = Dc->DevInfo->hpalDefault; 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) if (!bPaletteMatch)
{ {
ppalDst = PALETTE_LockPalette(hDestPalette); ppalDst = PALETTE_LockPalette(hDestPalette);
@ -697,10 +710,6 @@ NtGdiGetDIBitsInternal(
DPRINT("ppalDst : %p\n", ppalDst); DPRINT("ppalDst : %p\n", ppalDst);
ASSERT(ppalDst); ASSERT(ppalDst);
} }
else
{
ppalDst = ppalSrc;
}
/* Copy palette. */ /* Copy palette. */
/* FIXME: This is largely incomplete. ATM no Core!*/ /* FIXME: This is largely incomplete. ATM no Core!*/
@ -970,7 +979,7 @@ NtGdiGetDIBitsInternal(
} }
} }
cleanup: cleanup:
PALETTE_UnlockPalette(ppalSrc); PALETTE_ShareUnlockPalette(ppalSrc);
if (hDestBitmap != NULL) if (hDestBitmap != NULL)
EngDeleteSurface((HSURF)hDestBitmap); EngDeleteSurface((HSURF)hDestBitmap);

View file

@ -872,7 +872,6 @@ IntGdiGradientFill(
POINTL DitherOrg; POINTL DitherOrg;
ULONG i; ULONG i;
BOOL Ret; BOOL Ret;
HPALETTE hDestPalette;
ASSERT(dc); ASSERT(dc);
ASSERT(pVertex); ASSERT(pVertex);
@ -936,10 +935,19 @@ IntGdiGradientFill(
/* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */ /* FIXME - psurf can be NULL!!! Don't assert but handle this case gracefully! */
ASSERT(psurf); ASSERT(psurf);
hDestPalette = psurf->hDIBPalette; if (psurf->hDIBPalette)
if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault; {
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); EXLATEOBJ_vInitialize(&exlo, &gpalRGB, PalDestGDI, 0, 0, 0);
Ret = IntEngGradientFill(&psurf->SurfObj, Ret = IntEngGradientFill(&psurf->SurfObj,
@ -956,7 +964,7 @@ IntGdiGradientFill(
EXLATEOBJ_vCleanup(&exlo); EXLATEOBJ_vCleanup(&exlo);
if (PalDestGDI) if (PalDestGDI)
PALETTE_UnlockPalette(PalDestGDI); PALETTE_ShareUnlockPalette(PalDestGDI);
return Ret; return Ret;
} }
@ -1089,7 +1097,6 @@ NtGdiExtFloodFill(
PDC dc; PDC dc;
PDC_ATTR pdcattr; PDC_ATTR pdcattr;
SURFACE *psurf = NULL; SURFACE *psurf = NULL;
HPALETTE hpal;
PPALETTE ppal; PPALETTE ppal;
EXLATEOBJ exlo; EXLATEOBJ exlo;
BOOL Ret = FALSE; BOOL Ret = FALSE;
@ -1135,9 +1142,18 @@ NtGdiExtFloodFill(
goto cleanup; goto cleanup;
} }
hpal = dc->dclevel.pSurface->hDIBPalette; if (psurf->hDIBPalette)
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault; {
ppal = PALETTE_ShareLockPalette(hpal); 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); EXLATEOBJ_vInitialize(&exlo, &gpalRGB, ppal, 0, 0xffffff, 0);

View file

@ -3168,7 +3168,6 @@ GreExtTextOutW(
BOOLEAN Render; BOOLEAN Render;
POINT Start; POINT Start;
BOOL DoBreak = FALSE; BOOL DoBreak = FALSE;
HPALETTE hDestPalette;
PPALETTE ppalDst; PPALETTE ppalDst;
USHORT DxShift; USHORT DxShift;
@ -3440,14 +3439,22 @@ GreExtTextOutW(
SurfObj = &psurf->SurfObj ; SurfObj = &psurf->SurfObj ;
/* Create the xlateobj */ /* Create the xlateobj */
hDestPalette = psurf->hDIBPalette; if (psurf->hDIBPalette)
if (!hDestPalette) hDestPalette = pPrimarySurface->devinfo.hpalDefault; {
//if (!hDestPalette) hDestPalette = StockObjects[DEFAULT_PALETTE];//pPrimarySurface->devinfo.hpalDefault; ppalDst = PALETTE_ShareLockPalette(psurf->hDIBPalette);
ppalDst = PALETTE_LockPalette(hDestPalette); }
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); ASSERT(ppalDst);
EXLATEOBJ_vInitialize(&exloRGB2Dst, &gpalRGB, ppalDst, 0, 0, 0); EXLATEOBJ_vInitialize(&exloRGB2Dst, &gpalRGB, ppalDst, 0, 0, 0);
EXLATEOBJ_vInitialize(&exloDst2RGB, ppalDst, &gpalRGB, 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)) if ((fuOptions & ETO_OPAQUE) && (dc->pdcattr->ulDirty_ & DIRTY_BACKGROUND))
DC_vUpdateBackgroundBrush(dc) ; DC_vUpdateBackgroundBrush(dc) ;