- Fixed NtGdiAlphaBlend prototype.
[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 << 16)); // 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 return FALSE;
125 }
126
127 PLDC GdiGetLDC(HDC hDC)
128 {
129 PDC_ATTR Dc_Attr;
130 if (!GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr))
131 return NULL;
132 return Dc_Attr->pvLDC;
133 }
134
135 /*
136 * @implemented
137 */
138 DWORD
139 STDCALL
140 GdiSetBatchLimit(DWORD Limit)
141 {
142 DWORD OldLimit = GDI_BatchLimit;
143 if ((!Limit) || (Limit > GDI_BATCH_LIMIT)) return Limit;
144 GdiFlush();
145 GDI_BatchLimit = Limit;
146 return OldLimit;
147 }
148
149
150 /*
151 * @implemented
152 */
153 DWORD
154 STDCALL
155 GdiGetBatchLimit()
156 {
157 return GDI_BatchLimit;
158 }
159
160
161 /*
162 * @unimplemented
163 */
164 BOOL
165 STDCALL
166 GdiReleaseLocalDC(HDC hdc)
167 {
168 return 0;
169 }
170
171
172 /*
173 * @unimplemented
174 */
175 BOOL
176 STDCALL
177 GdiReleaseDC(HDC hdc)
178 {
179 GdiReleaseLocalDC(hdc);
180 return 0;
181 }
182
183 INT STDCALL
184 ExtEscape(
185 HDC hDC,
186 int nEscape,
187 int cbInput,
188 LPCSTR lpszInData,
189 int cbOutput,
190 LPSTR lpszOutData
191 )
192 {
193 return NtGdiExtEscape(hDC, NULL, 0, nEscape, cbInput, (LPSTR)lpszInData, cbOutput, lpszOutData);
194 }