mirror of
https://github.com/reactos/reactos.git
synced 2025-05-28 13:38:19 +00:00
[WIN32K]
- 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:
parent
3d533cb7a2
commit
db93f2d307
10 changed files with 190 additions and 106 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) ;
|
||||
|
|
Loading…
Reference in a new issue