diff --git a/reactos/include/reactos/drivers/directx/dxeng.h b/reactos/include/reactos/drivers/directx/dxeng.h index 0b43e8ef666..a81a648487b 100644 --- a/reactos/include/reactos/drivers/directx/dxeng.h +++ b/reactos/include/reactos/drivers/directx/dxeng.h @@ -81,7 +81,7 @@ BOOLEAN STDCALL DxEngSetHdevData(HDEV, DXEGSHDEVDATA, DWORD_PTR); BOOLEAN STDCALL DxEngLockHdev(HDEV hdev); BOOLEAN STDCALL DxEngUnlockHdev(HDEV hdev); DWORD_PTR STDCALL DxEngGetDCState(HDC hDC, DWORD type); -DWORD STDCALL DxEngReferenceHdev(HDEV hdev); +BOOLEAN STDCALL DxEngReferenceHdev(HDEV hdev); BOOLEAN STDCALL DxEngLockShareSem(); BOOLEAN STDCALL DxEngUnlockShareSem(); DWORD STDCALL DxEngScreenAccessCheck(); @@ -99,14 +99,14 @@ BOOLEAN STDCALL DxEngIncDispUniq(); HDC STDCALL DxEngCreateMemoryDC(HDEV hDev); -DWORD STDCALL DxEngIsHdevLockedByCurrentThread(DWORD x1); -DWORD STDCALL DxEngUnreferenceHdev(DWORD x1); +BOOLEAN STDCALL DxEngIsHdevLockedByCurrentThread(HDEV hDev); +BOOLEAN STDCALL DxEngUnreferenceHdev(HDEV hDev); DWORD STDCALL DxEngSpTearDownSprites(DWORD x1, DWORD x2, DWORD x3); DWORD STDCALL DxEngSpUnTearDownSprites(DWORD x1, DWORD x2, DWORD x3); DWORD STDCALL DxEngSpSpritesVisible(DWORD x1); HDC STDCALL DxEngGetDesktopDC(ULONG DcType, BOOL EmptyDC, BOOL ValidatehWnd); BOOLEAN STDCALL DxEngDeleteDC(HDC hdc, BOOL Force); -DWORD STDCALL DxEngSetDCState(DWORD x1, DWORD x2, DWORD x3); +BOOLEAN STDCALL DxEngSetDCState(HDC hDC, DWORD SetType, DWORD Set); DWORD STDCALL DxEngSelectBitmap(DWORD x1, DWORD x2); DWORD STDCALL DxEngSetBitmapOwner(DWORD x1, DWORD x2); DWORD STDCALL DxEngDeleteSurface(DWORD x1); diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index 0194d9aa92b..1c7ffea3f9e 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -261,5 +261,7 @@ UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode); UINT STDCALL IntGdiGetTextAlign(HDC hDC); COLORREF STDCALL IntGdiGetTextColor(HDC hDC); INT STDCALL IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode); +VOID FASTCALL IntGdiReferencePdev(PGDIDEVICE pPDev); +VOID FASTCALL IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType); #endif /* not __WIN32K_DC_H */ diff --git a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c index 7b960179618..ea8b3b3627e 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c @@ -592,12 +592,11 @@ DxEngUnlockHdev(HDEV hDev) /************************************************************************/ /* DxEngReferenceHdev */ /************************************************************************/ -DWORD +BOOLEAN STDCALL DxEngReferenceHdev(HDEV hDev) { - UNIMPLEMENTED; - + IntGdiReferencePdev((PGDIDEVICE) hDev);; /* ALWAYS return true */ return TRUE; } @@ -680,24 +679,24 @@ DWORD STDCALL DxEngScreenAccessCheck() /************************************************************************/ /* DxEngIsHdevLockedByCurrentThread */ /************************************************************************/ -DWORD +BOOLEAN STDCALL -DxEngIsHdevLockedByCurrentThread(DWORD x1) -{ - UNIMPLEMENTED; - return FALSE; +DxEngIsHdevLockedByCurrentThread(HDEV hDev) +{ // base on EngIsSemaphoreOwnedByCurrentThread w/o the Ex call. + PERESOURCE pSem = ((PGDIDEVICE)hDev)->hsemDevLock; + return pSem->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)PsGetCurrentThread(); } /************************************************************************/ /* DxEngUnreferenceHdev */ /************************************************************************/ -DWORD +BOOLEAN STDCALL -DxEngUnreferenceHdev(DWORD x1) +DxEngUnreferenceHdev(HDEV hDev) { - UNIMPLEMENTED; - return FALSE; + IntGdiUnreferencePdev((PGDIDEVICE) hDev, 0); + return TRUE; // Always true. } /************************************************************************/ @@ -757,10 +756,27 @@ BOOL STDCALL DxEngSetDCOwner(HGDIOBJ hObject, DWORD OwnerMask) /************************************************************************/ /* DxEngSetDCState */ /************************************************************************/ -DWORD STDCALL DxEngSetDCState(DWORD x1, DWORD x2, DWORD x3) +BOOLEAN +STDCALL +DxEngSetDCState(HDC hDC, DWORD SetType, DWORD Set) { - UNIMPLEMENTED; - return FALSE; + BOOLEAN Ret = FALSE; + PDC pDC = DC_LockDc(hDC); + + if (pDC) + { + if (SetType == 1) + { + if ( Set ) + pDC->DC_Flags |= DC_FLAG_FULLSCREEN; + else + pDC->DC_Flags &= ~DC_FLAG_FULLSCREEN; + Ret = TRUE; + } + DC_UnlockDc(pDC); + return Ret; // Everything else returns FALSE. + } + return Ret; } /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index 443b3cb1d76..d99b9080656 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -2699,6 +2699,19 @@ IntEnumHDev(VOID) return &PrimarySurface; } +VOID FASTCALL +IntGdiReferencePdev(PGDIDEVICE pPDev) +{ + pPDev->cPdevRefs++; +} + +VOID FASTCALL +IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType) +{ + pPDev->cPdevRefs--; +} + + #define SIZEOF_DEVMODEW_300 188 #define SIZEOF_DEVMODEW_400 212 #define SIZEOF_DEVMODEW_500 220