mirror of
https://github.com/reactos/reactos.git
synced 2025-05-17 16:27:00 +00:00
[WIN32K]
- 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:
parent
ed7952a360
commit
5d0f363c9f
4 changed files with 40 additions and 35 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue