From 5d0f363c9f1fe328ce4fb3d5197040ef26a376e2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 29 Dec 2014 13:12:05 +0000 Subject: [PATCH] [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 --- reactos/win32ss/gdi/ntgdi/dc.h | 6 ++-- reactos/win32ss/gdi/ntgdi/dclife.c | 46 +++++++++++++++++++--------- reactos/win32ss/gdi/ntgdi/dcstate.c | 2 +- reactos/win32ss/gdi/ntgdi/metafile.c | 21 ++----------- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/reactos/win32ss/gdi/ntgdi/dc.h b/reactos/win32ss/gdi/ntgdi/dc.h index d1000fcac2a..2db234a3294 100644 --- a/reactos/win32ss/gdi/ntgdi/dc.h +++ b/reactos/win32ss/gdi/ntgdi/dc.h @@ -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); } diff --git a/reactos/win32ss/gdi/ntgdi/dclife.c b/reactos/win32ss/gdi/ntgdi/dclife.c index 9dce67611e2..22056f34ec3 100644 --- a/reactos/win32ss/gdi/ntgdi/dclife.c +++ b/reactos/win32ss/gdi/ntgdi/dclife.c @@ -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) diff --git a/reactos/win32ss/gdi/ntgdi/dcstate.c b/reactos/win32ss/gdi/ntgdi/dcstate.c index 38ad48174b9..f3da8118cb0 100644 --- a/reactos/win32ss/gdi/ntgdi/dcstate.c +++ b/reactos/win32ss/gdi/ntgdi/dcstate.c @@ -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"); diff --git a/reactos/win32ss/gdi/ntgdi/metafile.c b/reactos/win32ss/gdi/ntgdi/metafile.c index bf0f30ee894..6dafea7809d 100644 --- a/reactos/win32ss/gdi/ntgdi/metafile.c +++ b/reactos/win32ss/gdi/ntgdi/metafile.c @@ -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 */