mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 04:13:32 +00:00
[GDI32]
- Handle GDILoObjType_LO_ALTDC_TYPE in GdiGetDcAttr - Rewrite GdiGetLDC using GdiGetDcAttr - Implement GdiSetLDC svn path=/trunk/; revision=65058
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user