- Implement GreCreateCompatibleDC, allowing to pass in a boolean value, specifying the DC type (normal or "alternative" DC, aka metafile DC)
- Properly implement NtGdiCreateMetafileDC around GreCreateCompatibleDC

svn path=/trunk/; revision=65885
This commit is contained in:
Timo Kreuzer 2014-12-29 13:12:05 +00:00
parent ed7952a360
commit 5d0f363c9f
4 changed files with 40 additions and 35 deletions

View file

@ -182,7 +182,7 @@ COLORREF FASTCALL IntSetDCPenColor(HDC,COLORREF);
INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID);
PPDEVOBJ FASTCALL IntEnumHDev(VOID);
PDC NTAPI DC_AllocDcWithHandle(VOID);
PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType);
BOOL NTAPI DC_bAllocDcAttr(PDC pdc);
VOID NTAPI DC_vCleanup(PVOID ObjectBody);
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
@ -205,6 +205,7 @@ BOOL FASTCALL IntGdiCleanDC(HDC hDC);
VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc);
VOID
NTAPI
@ -219,7 +220,8 @@ DC_LockDc(HDC hdc)
pdc = GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE);
if (pdc)
{
ASSERT(GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE);
ASSERT((GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE) ||
(GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_ALTDC_TYPE));
ASSERT(pdc->dclevel.plfnt != NULL);
ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE);
}

View file

@ -66,10 +66,14 @@ InitDcImpl()
PDC
NTAPI
DC_AllocDcWithHandle()
DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType)
{
PDC pdc;
NT_ASSERT((eDcObjType == GDILoObjType_LO_DC_TYPE) ||
(eDcObjType == GDILoObjType_LO_ALTDC_TYPE));
/* Allocate the object */
pdc = (PDC)GDIOBJ_AllocateObject(GDIObjType_DC_TYPE,
sizeof(DC),
BASEFLAG_LOOKASIDE);
@ -79,6 +83,10 @@ DC_AllocDcWithHandle()
return NULL;
}
/* Set the actual DC type */
pdc->BaseObject.hHmgr = UlongToHandle(eDcObjType);
/* Insert the object */
if (!GDIOBJ_hInsertObject(&pdc->BaseObject, GDI_OBJ_HMGR_POWNED))
{
DPRINT1("Could not insert DC into handle table.\n");
@ -95,6 +103,15 @@ DC_AllocDcWithHandle()
void
DC_InitHack(PDC pdc)
{
if (defaultDCstate == NULL)
{
defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC);
ASSERT(defaultDCstate);
RtlZeroMemory(defaultDCstate, sizeof(DC));
defaultDCstate->pdcattr = &defaultDCstate->dcattr;
DC_vCopyState(pdc, defaultDCstate, TRUE);
}
TextIntRealizeFont(pdc->pdcattr->hlfntNew,NULL);
pdc->pdcattr->iCS_CP = ftGdiGetTextCharsetInfo(pdc,NULL,0);
@ -327,15 +344,6 @@ DC_vInitDc(
pdc->dcattr.iGraphicsMode = GM_COMPATIBLE;
pdc->dcattr.iCS_CP = 0;
pdc->pSurfInfo = NULL;
if (defaultDCstate == NULL)
{
defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC);
ASSERT(defaultDCstate);
RtlZeroMemory(defaultDCstate, sizeof(DC));
defaultDCstate->pdcattr = &defaultDCstate->dcattr;
DC_vCopyState(pdc, defaultDCstate, TRUE);
}
}
VOID
@ -631,7 +639,7 @@ GreOpenDCW(
DPRINT("GreOpenDCW - ppdev = %p\n", ppdev);
pdc = DC_AllocDcWithHandle();
pdc = DC_AllocDcWithHandle(GDILoObjType_LO_DC_TYPE);
if (!pdc)
{
DPRINT1("Could not Allocate a DC\n");
@ -755,8 +763,9 @@ NtGdiOpenDCW(
HDC
APIENTRY
NtGdiCreateCompatibleDC(HDC hdc)
GreCreateCompatibleDC(HDC hdc, BOOL bAltDc)
{
GDILOOBJTYPE eDcObjType;
HDC hdcNew;
PPDEVOBJ ppdev;
PDC pdc, pdcNew;
@ -794,7 +803,8 @@ NtGdiCreateCompatibleDC(HDC hdc)
}
/* Allocate a new DC */
pdcNew = DC_AllocDcWithHandle();
eDcObjType = bAltDc ? GDILoObjType_LO_ALTDC_TYPE : GDILoObjType_LO_DC_TYPE;
pdcNew = DC_AllocDcWithHandle(eDcObjType);
if (!pdcNew)
{
DPRINT1("Could not allocate a new DC\n");
@ -804,7 +814,7 @@ NtGdiCreateCompatibleDC(HDC hdc)
hdcNew = pdcNew->BaseObject.hHmgr;
/* Lock ppdev and initialize the new DC */
DC_vInitDc(pdcNew, DCTYPE_MEMORY, ppdev);
DC_vInitDc(pdcNew, bAltDc ? DCTYPE_INFO : DCTYPE_MEMORY, ppdev);
/* FIXME: HACK! */
DC_InitHack(pdcNew);
@ -818,6 +828,14 @@ NtGdiCreateCompatibleDC(HDC hdc)
return hdcNew;
}
HDC
APIENTRY
NtGdiCreateCompatibleDC(HDC hdc)
{
/* Call the internal function to create a normal memory DC */
return GreCreateCompatibleDC(hdc, FALSE);
}
BOOL
FASTCALL
IntGdiDeleteDC(HDC hDC, BOOL Force)

View file

@ -262,7 +262,7 @@ NtGdiSaveDC(
}
/* Allocate a new dc */
pdcSave = DC_AllocDcWithHandle();
pdcSave = DC_AllocDcWithHandle(GDILoObjType_LO_DC_TYPE);
if (pdcSave == NULL)
{
DPRINT("Could not allocate a new DC\n");

View file

@ -34,23 +34,8 @@ HDC
APIENTRY
NtGdiCreateMetafileDC(IN HDC hdc)
{
PDC pDc;
HDC ret = NULL;
if (hdc)
{
pDc = DC_LockDc(hdc);
if (pDc)
{ // Not sure this is right for getting the HDEV handle, maybe Timo could help or just if'ed it out.
ret = IntGdiCreateDisplayDC(pDc->ppdev->BaseObject.hHmgr, DC_TYPE_INFO, TRUE);
DC_UnlockDc(pDc);
}
}
else
{
ret = UserGetDesktopDC(DC_TYPE_INFO, TRUE, FALSE);
}
return ret;
/* Call the internal function to create an alternative info DC */
return GreCreateCompatibleDC(hdc, TRUE);
}
/*
@ -68,7 +53,7 @@ NtGdiCreateServerMetaFile(IN DWORD iType,
UNIMPLEMENTED;
return NULL;
}
/*
* @unimplemented
*/