mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:03:00 +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
|
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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) ;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue