From bd446bbb0151de6360dab7781f8d9e47cd2d1f79 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 28 Oct 2014 00:16:18 +0000 Subject: [PATCH] [GDI32] - Handle GDILoObjType_LO_ALTDC_TYPE in GdiGetDcAttr - Rewrite GdiGetLDC using GdiGetDcAttr - Implement GdiSetLDC svn path=/trunk/; revision=65058 --- reactos/win32ss/gdi/gdi32/include/gdi32p.h | 20 +++++++- reactos/win32ss/gdi/gdi32/misc/misc.c | 59 +++++++++++----------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/include/gdi32p.h b/reactos/win32ss/gdi/gdi32/include/gdi32p.h index 3f0c445a598..c453784036e 100644 --- a/reactos/win32ss/gdi/gdi32/include/gdi32p.h +++ b/reactos/win32ss/gdi/gdi32/include/gdi32p.h @@ -213,6 +213,10 @@ PLDC FASTCALL GdiGetLDC(HDC hDC); +BOOL +FASTCALL +GdiSetLDC(HDC hdc, PVOID pvLDC); + HGDIOBJ WINAPI GdiFixUpHandle(HGDIOBJ hGO); @@ -369,9 +373,23 @@ FORCEINLINE PDC_ATTR GdiGetDcAttr(HDC hdc) { + GDILOOBJTYPE eDcObjType; PDC_ATTR pdcattr; - if (!GdiGetHandleUserData((HGDIOBJ)hdc, GDI_OBJECT_TYPE_DC, (PVOID*)&pdcattr)) return NULL; + /* Check DC object type */ + eDcObjType = GDI_HANDLE_GET_TYPE(hdc); + if ((eDcObjType != GDILoObjType_LO_DC_TYPE) && + (eDcObjType != GDILoObjType_LO_ALTDC_TYPE)) + { + return NULL; + } + + /* Get the DC attribute */ + if (!GdiGetHandleUserData((HGDIOBJ)hdc, eDcObjType, (PVOID*)&pdcattr)) + { + return NULL; + } + return pdcattr; } diff --git a/reactos/win32ss/gdi/gdi32/misc/misc.c b/reactos/win32ss/gdi/gdi32/misc/misc.c index f326114f129..9d6dae9e1df 100644 --- a/reactos/win32ss/gdi/gdi32/misc/misc.c +++ b/reactos/win32ss/gdi/gdi32/misc/misc.c @@ -145,41 +145,40 @@ BOOL GdiGetHandleUserData(HGDIOBJ hGdiObj, DWORD ObjectType, PVOID *UserData) PLDC FASTCALL -GdiGetLDC(HDC hDC) +GdiGetLDC(HDC hdc) { - PDC_ATTR Dc_Attr; - PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX((HGDIOBJ) hDC); - HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1); - // Don't check the mask, just the object type. - if ( Entry->ObjectType == GDIObjType_DC_TYPE && - (pid == NULL || pid == CurrentProcessId) ) - { - BOOL Result = TRUE; - if (Entry->UserData) - { - volatile CHAR *Current = (volatile CHAR*)Entry->UserData; - _SEH2_TRY - { - *Current = *Current; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Result = FALSE; - } - _SEH2_END - } - else - Result = FALSE; + PDC_ATTR pdcattr; - if (Result) - { - Dc_Attr = (PDC_ATTR)Entry->UserData; - return Dc_Attr->pvLDC; - } + /* Get the DC attribute */ + pdcattr = GdiGetDcAttr(hdc); + if (pdcattr == NULL) + { + return NULL; } - return NULL; + + /* Return the LDC pointer */ + return pdcattr->pvLDC; } +BOOL +FASTCALL +GdiSetLDC(HDC hdc, PVOID pvLDC) +{ + PDC_ATTR pdcattr; + + /* Get the DC attribute */ + pdcattr = GdiGetDcAttr(hdc); + if (pdcattr == NULL) + { + return FALSE; + } + + /* Set the LDC pointer */ + pdcattr->pvLDC = pvLDC; + return TRUE; +} + + VOID GdiSAPCallback(PLDC pldc) { DWORD Time, NewTime = GetTickCount();