xref: /reactos/win32ss/gdi/ntgdi/dcattr.c (revision 1734f297)
1 /*
2  * COPYRIGHT:         See COPYING in the top level directory
3  * PROJECT:           ReactOS kernel
4  * PURPOSE:           Functions for creation and destruction of DCs
5  * FILE:              win32ss/gdi/ntgdi/dcattr.c
6  * PROGRAMER:         Timo Kreuzer (timo.kreuzer@rectos.org)
7  */
8 
9 #include <win32k.h>
10 
11 #define NDEBUG
12 #include <debug.h>
13 
14 #define GDIDCATTRFREE 8
15 
16 typedef struct _GDI_DC_ATTR_FREELIST
17 {
18   LIST_ENTRY Entry;
19   DWORD nEntries;
20   PVOID AttrList[GDIDCATTRFREE];
21 } GDI_DC_ATTR_FREELIST, *PGDI_DC_ATTR_FREELIST;
22 
23 typedef struct _GDI_DC_ATTR_ENTRY
24 {
25   DC_ATTR Attr[GDIDCATTRFREE];
26 } GDI_DC_ATTR_ENTRY, *PGDI_DC_ATTR_ENTRY;
27 
28 
29 BOOL
30 NTAPI
31 DC_bAllocDcAttr(PDC pdc)
32 {
33     PPROCESSINFO ppi;
34     PDC_ATTR pdcattr;
35 
36     ppi = PsGetCurrentProcessWin32Process();
37     ASSERT(ppi);
38 
39     pdcattr = GdiPoolAllocate(ppi->pPoolDcAttr);
40     if (!pdcattr)
41     {
42         DPRINT1("Could not allocate DC attr\n");
43         return FALSE;
44     }
45 
46     /* Copy the content from the kernel mode dc attr */
47     pdc->pdcattr = pdcattr;
48     *pdc->pdcattr = pdc->dcattr;
49 
50     /* Set the object attribute in the handle table */
51     GDIOBJ_vSetObjectAttr(&pdc->BaseObject, pdcattr);
52 
53     DPRINT("DC_AllocDcAttr: pdc=%p, pdc->pdcattr=%p\n", pdc, pdc->pdcattr);
54     return TRUE;
55 }
56 
57 VOID
58 NTAPI
59 DC_vFreeDcAttr(PDC pdc)
60 {
61     PPROCESSINFO ppi;
62 
63     if (pdc->pdcattr == &pdc->dcattr)
64     {
65         // Internal DC object!
66         return;
67     }
68 
69     /* Reset the object attribute in the handle table */
70     GDIOBJ_vSetObjectAttr(&pdc->BaseObject, NULL);
71 
72     ppi = PsGetCurrentProcessWin32Process();
73     ASSERT(ppi);
74     GdiPoolFree(ppi->pPoolDcAttr, pdc->pdcattr);
75 
76     /* Reset to kmode dcattr */
77     pdc->pdcattr = &pdc->dcattr;
78 }
79