Fix processid mask, update gdi handle entry, shift mask and VM memory alloc.
[reactos.git] / reactos / dll / win32 / gdi32 / misc / misc.c
1 /*
2 * ReactOS GDI lib
3 * Copyright (C) 2003 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 /* $Id$
20 *
21 * PROJECT: ReactOS gdi32.dll
22 * FILE: lib/gdi32/misc/misc.c
23 * PURPOSE: Miscellaneous functions
24 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
25 * UPDATE HISTORY:
26 * 2004/09/04 Created
27 */
28
29 #include "precomp.h"
30
31 PGDI_TABLE_ENTRY GdiHandleTable = NULL;
32 HANDLE CurrentProcessId = NULL;
33 DWORD GDI_BatchLimit = 1;
34
35
36 BOOL
37 STDCALL
38 GdiAlphaBlend(
39 HDC hDCDst,
40 int DstX,
41 int DstY,
42 int DstCx,
43 int DstCy,
44 HDC hDCSrc,
45 int SrcX,
46 int SrcY,
47 int SrcCx,
48 int SrcCy,
49 BLENDFUNCTION BlendFunction
50 )
51 {
52 if ( hDCSrc == NULL ) return FALSE;
53
54 if (GDI_HANDLE_GET_TYPE(hDCSrc) == GDI_OBJECT_TYPE_METADC) return FALSE;
55
56 return NtGdiAlphaBlend(
57 hDCDst,
58 DstX,
59 DstY,
60 DstCx,
61 DstCy,
62 hDCSrc,
63 SrcX,
64 SrcY,
65 SrcCx,
66 SrcCy,
67 BlendFunction,
68 0 );
69 }
70
71 /*
72 * @implemented
73 */
74 HGDIOBJ
75 STDCALL
76 GdiFixUpHandle(HGDIOBJ hGdiObj)
77 {
78 if (((ULONG_PTR)(hGdiObj)) & GDI_HANDLE_UPPER_MASK ) return hGdiObj;
79 PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hGdiObj);
80 return hGdiObj = (HGDIOBJ)(((LONG_PTR)(hGdiObj)) |
81 (Entry->Type << GDI_ENTRY_UPPER_SHIFT)); // Rebuild handle for Object
82 }
83
84 /*
85 * @implemented
86 */
87 PVOID
88 STDCALL
89 GdiQueryTable(VOID)
90 {
91 return (PVOID)GdiHandleTable;
92 }
93
94 BOOL GdiIsHandleValid(HGDIOBJ hGdiObj)
95 {
96 PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hGdiObj);
97 if(Entry->KernelData != NULL &&
98 (Entry->Type & GDI_HANDLE_TYPE_MASK) ==
99 (LONG)GDI_HANDLE_GET_TYPE(hGdiObj))
100 {
101 HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
102 if(pid == NULL || pid == CurrentProcessId)
103 {
104 return TRUE;
105 }
106 }
107 return FALSE;
108 }
109
110 BOOL GdiGetHandleUserData(HGDIOBJ hGdiObj, PVOID *UserData)
111 {
112 PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hGdiObj);
113 if(Entry->KernelData != NULL &&
114 (Entry->Type & GDI_HANDLE_TYPE_MASK) ==
115 (LONG)GDI_HANDLE_GET_TYPE(hGdiObj))
116 {
117 HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
118 if(pid == NULL || pid == CurrentProcessId)
119 {
120 *UserData = Entry->UserData;
121 return TRUE;
122 }
123 }
124 SetLastError(ERROR_INVALID_PARAMETER);
125 return FALSE;
126 }
127
128 PLDC GdiGetLDC(HDC hDC)
129 {
130 PDC_ATTR Dc_Attr;
131 if (!GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr))
132 return NULL;
133 return Dc_Attr->pvLDC;
134 }
135
136 /*
137 * @implemented
138 */
139 DWORD
140 STDCALL
141 GdiSetBatchLimit(DWORD Limit)
142 {
143 DWORD OldLimit = GDI_BatchLimit;
144 if ((!Limit) || (Limit > GDI_BATCH_LIMIT)) return Limit;
145 GdiFlush();
146 GDI_BatchLimit = Limit;
147 return OldLimit;
148 }
149
150
151 /*
152 * @implemented
153 */
154 DWORD
155 STDCALL
156 GdiGetBatchLimit()
157 {
158 return GDI_BatchLimit;
159 }
160
161 /*
162 * @unimplemented
163 */
164 BOOL
165 STDCALL
166 GdiReleaseDC(HDC hdc)
167 {
168 return 0;
169 }
170
171 INT STDCALL
172 ExtEscape(
173 HDC hDC,
174 int nEscape,
175 int cbInput,
176 LPCSTR lpszInData,
177 int cbOutput,
178 LPSTR lpszOutData
179 )
180 {
181 return NtGdiExtEscape(hDC, NULL, 0, nEscape, cbInput, (LPSTR)lpszInData, cbOutput, lpszOutData);
182 }