[NtGDI] Set Xform flags if a changed
[reactos.git] / win32ss / gdi / ntgdi / baseobj.hpp
1
2 #pragma once
3
4 #define GDIOBJ_POOL_TAG(type) ('00hG' + (((type) & 0x1f) << 24))
5
6 #define BASEOBJECT CBASEOBJECT
7
8 class BASEOBJECT : private _BASEOBJECT
9 {
10 public:
11
12 enum OWNER
13 {
14 POWNED = GDI_OBJ_HMGR_POWNED,
15 PUBLIC = GDI_OBJ_HMGR_PUBLIC,
16 NONE = GDI_OBJ_HMGR_NONE
17 };
18
19 protected:
20
21 BASEOBJECT(
22 _In_ GDILOOBJTYPE loobjtype)
23 {
24 /* Initialize the object */
25 _BASEOBJECT::hHmgr = (HGDIOBJ)(ULONG_PTR)loobjtype;
26 this->cExclusiveLock = 0;
27 this->ulShareCount = 1;
28 this->BaseFlags = 0;//fl & 0xffff;
29 DBG_INITLOG(&this->slhLog);
30 DBG_LOGEVENT(&this->slhLog, EVENT_ALLOCATE, 0);
31 #if DBG_ENABLE_GDIOBJ_BACKTRACES
32 DbgCaptureStackBackTace(this->apvBackTrace, 1, GDI_OBJECT_STACK_LEVELS);
33 #endif /* GDI_DEBUG */
34 }
35
36 static
37 BASEOBJECT*
38 LockExclusive(
39 HGDIOBJ hobj,
40 GDIOBJTYPE objtype);
41
42 static
43 BASEOBJECT*
44 LockExclusive(
45 HGDIOBJ hobj,
46 GDILOOBJTYPE loobjtype);
47
48 static
49 BASEOBJECT*
50 LockShared(
51 HGDIOBJ hobj,
52 GDILOOBJTYPE loobjtype,
53 OWNER owner)
54 {
55 /// FIXME: should check owner!
56 return reinterpret_cast<CBASEOBJECT*>(GDIOBJ_ShareLockObj(hobj, loobjtype));
57 }
58
59 VOID
60 vSetObjectAttr(
61 _In_opt_ PVOID pvUserAttr)
62 {
63 GDIOBJ_vSetObjectAttr((POBJ)this, pvUserAttr);
64 }
65
66
67 public:
68
69 static
70 inline
71 PVOID
72 pvAllocate(
73 _In_ GDIOBJTYPE objtype,
74 _In_ SIZE_T cjSize)
75 {
76 return ExAllocatePoolWithTag(PagedPool, cjSize, GDIOBJ_POOL_TAG(objtype));
77 }
78
79 VOID
80 vUnlock(
81 VOID)
82 {
83 if (this->cExclusiveLock > 0)
84 {
85 GDIOBJ_vUnlockObject(this);
86 }
87 else
88 {
89 GDIOBJ_vDereferenceObject(this);
90 }
91 }
92
93 inline
94 HGDIOBJ
95 hHmgr(
96 VOID)
97 {
98 return _BASEOBJECT::hHmgr;
99 }
100
101 HGDIOBJ
102 hInsertObject(
103 OWNER owner)
104 {
105 return GDIOBJ_hInsertObject(this, owner);
106 }
107
108 };
109
110