[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / include / gdiobj.h
index e777219..a1a56b7 100644 (file)
@@ -3,11 +3,11 @@
  *
  */
 
-#ifndef __WIN32K_GDIOBJ_H
-#define __WIN32K_GDIOBJ_H
+#pragma once
 
 /* Public GDI Object/Handle definitions */
 #include <win32k/ntgdihdl.h>
+#include "win32.h"
 
 typedef struct _GDI_HANDLE_TABLE
 {
@@ -20,7 +20,7 @@ typedef struct _GDI_HANDLE_TABLE
   FLONG           flDeviceUniq;            // Device settings uniqueness.
   PVOID           pvLangPack;              // Language Pack.
   CFONT           cfPublic[GDI_CFONT_MAX]; // Public Fonts.
-  DWORD           dwCsbSupported1;         // OEM code-page bitfield.
+  DWORD           dwCFCount;
 //////////////////////////////////////////////////////////////////////////////
   PPAGED_LOOKASIDE_LIST LookasideLists;
 
@@ -43,20 +43,27 @@ typedef struct _BASEOBJECT
   ULONG       ulShareCount;
   USHORT      cExclusiveLock;
   USHORT      BaseFlags;
-  PW32THREAD  Tid;
+  PTHREADINFO Tid;
 } BASEOBJECT, *POBJ;
 
+typedef struct _CLIENTOBJ
+{
+  BASEOBJECT BaseObject;
+} CLIENTOBJ, *PCLIENTOBJ;
+
 enum BASEFLAGS
 {
-    BASEFLAG_LOOKASIDE = 0x80
+    BASEFLAG_LOOKASIDE = 0x80,
+
+    /* ReactOS specific: */
+    BASEFLAG_READY_TO_DIE = 0x1000
 };
 
 BOOL    INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
-VOID    INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
-VOID    INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
+BOOL    INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
+BOOL    INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
 BOOL    INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
-VOID    INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object);
-VOID    INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
+//VOID    INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
 BOOL    INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
 POBJ    INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
 POBJ    INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType);
@@ -64,6 +71,7 @@ VOID    INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType);
 BOOL    INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
 PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
 PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType);
+VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj);
 
 PVOID   INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process);
 
@@ -74,7 +82,57 @@ PVOID   INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCES
 #define GDIOBJFLAG_IGNOREPID   (0x1)
 #define GDIOBJFLAG_IGNORELOCK  (0x2)
 
-BOOL FASTCALL  NtGdiDeleteObject(HGDIOBJ hObject);
-BOOL FASTCALL  IsObjectDead(HGDIOBJ);
+BOOL FASTCALL GreDeleteObject(HGDIOBJ hObject);
+BOOL FASTCALL IsObjectDead(HGDIOBJ);
+BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL);
+BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD);
 
+/*!
+ * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked.
+ * You should unlock the object
+ * as soon as you don't need to have access to it's data.
+
+ * \param Object       Object pointer (as returned by GDIOBJ_LockObj).
+ */
+ULONG
+FORCEINLINE
+GDIOBJ_UnlockObjByPtr(POBJ Object)
+{
+    INT cLocks = InterlockedDecrement((PLONG)&Object->cExclusiveLock);
+    ASSERT(cLocks >= 0);
+    return cLocks;
+}
+
+ULONG
+FORCEINLINE
+GDIOBJ_ShareUnlockObjByPtr(POBJ Object)
+{
+    HGDIOBJ hobj = Object->hHmgr;
+    USHORT flags = Object->BaseFlags;
+    INT cLocks = InterlockedDecrement((PLONG)&Object->ulShareCount);
+    ASSERT(cLocks >= 0);
+    if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0))
+    {
+        GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess());
+        GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE);
+    }
+    return cLocks;
+}
+
+#ifdef GDI_DEBUG
+ULONG FASTCALL GDIOBJ_IncrementShareCount(POBJ Object);
+#else
+ULONG
+FORCEINLINE
+GDIOBJ_IncrementShareCount(POBJ Object)
+{
+    INT cLocks = InterlockedIncrement((PLONG)&Object->ulShareCount);
+    ASSERT(cLocks >= 1);
+    return cLocks;
+}
 #endif
+
+INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
+
+#define GDIOBJ_GetKernelObj(Handle) \
+  ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData