source: trunk/src/gdi32/objhandle.cpp@ 5472

Last change on this file since 5472 was 5472, checked in by sandervl, 24 years ago

compile fix

File size: 10.7 KB
Line 
1/* $Id: objhandle.cpp,v 1.13 2001-04-04 09:02:15 sandervl Exp $ */
2/*
3 * Win32 Handle Management Code for OS/2
4 *
5 *
6 * Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * TODO: The table should be dynamically increased when necessary
10 * This is just a quick and dirty implementation
11 *
12 * Project Odin Software License can be found in LICENSE.TXT
13 *
14 */
15
16#include <os2win.h>
17#include <stdlib.h>
18#include <string.h>
19#include <vmutex.h>
20#include <objhandle.h>
21#include <dcdata.h>
22#include <winuser32.h>
23#include "oslibgpi.h"
24#include "dibsect.h"
25#include "region.h"
26#include <unicode.h>
27
28#define DBG_LOCALLOG DBG_objhandle
29#include "dbglocal.h"
30
31//******************************************************************************
32
33typedef struct {
34 ULONG dwUserData;
35 ObjectType type;
36} GdiObject;
37
38static GdiObject objHandleTable[MAX_OBJECT_HANDLES] = {0};
39static ULONG lowestFreeIndex = 0;
40static VMutex objTableMutex;
41
42//******************************************************************************
43//******************************************************************************
44BOOL ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, ObjectType type)
45{
46 objTableMutex.enter(VMUTEX_WAIT_FOREVER);
47 if(lowestFreeIndex == -1) {
48 //oops, out of handles
49 objTableMutex.leave();
50 dprintf(("ERROR: GDI: ObjAllocateHandle OUT OF GDI OBJECT HANDLES!!"));
51 DebugInt3();
52 return FALSE;
53 }
54 *hObject = lowestFreeIndex;
55 *hObject |= MAKE_HANDLE(type);
56 objHandleTable[lowestFreeIndex].dwUserData = dwUserData;
57 objHandleTable[lowestFreeIndex].type = type;
58
59 lowestFreeIndex = -1;
60
61 //find next free handle
62 for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
63 if(objHandleTable[i].dwUserData == 0) {
64 lowestFreeIndex = i;
65 break;
66 }
67 }
68 objTableMutex.leave();
69 return TRUE;
70}
71//******************************************************************************
72//******************************************************************************
73void ObjFreeHandle(HANDLE hObject)
74{
75 hObject &= OBJHANDLE_MAGIC_MASK;
76 if(hObject < MAX_OBJECT_HANDLES) {
77 objTableMutex.enter(VMUTEX_WAIT_FOREVER);
78 objHandleTable[hObject].dwUserData = 0;
79 objHandleTable[hObject].type = GDIOBJ_NONE;
80 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
81 lowestFreeIndex = hObject;
82
83 objTableMutex.leave();
84 }
85}
86//******************************************************************************
87//******************************************************************************
88DWORD ObjGetHandleData(HANDLE hObject, ObjectType type)
89{
90 hObject &= OBJHANDLE_MAGIC_MASK;
91 if(hObject < MAX_OBJECT_HANDLES && type == objHandleTable[hObject].type) {
92 return objHandleTable[hObject].dwUserData;
93 }
94 return HANDLE_OBJ_ERROR;
95}
96//******************************************************************************
97//******************************************************************************
98ObjectType ObjGetHandleType(HANDLE hObject)
99{
100 DWORD objtype;
101
102 switch(OBJHANDLE_MAGIC(hObject))
103 {
104 case GDIOBJ_REGION:
105 hObject &= OBJHANDLE_MAGIC_MASK;
106 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].type == GDIOBJ_REGION) {
107 return GDIOBJ_REGION;
108 }
109 break;
110
111 case USEROBJ_MENU:
112 hObject &= OBJHANDLE_MAGIC_MASK;
113 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].type == USEROBJ_MENU) {
114 return USEROBJ_MENU;
115 }
116 break;
117
118 case GDIOBJ_NONE:
119 //could be a cutoff menu handle, check this
120 //TODO: dangerous assumption! (need to rewrite object handle management)
121 hObject &= OBJHANDLE_MAGIC_MASK;
122 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwUserData != 0 && objHandleTable[hObject].type == USEROBJ_MENU) {
123 return USEROBJ_MENU;
124 }
125 break;
126
127 case GDIOBJ_BITMAP:
128 case GDIOBJ_BRUSH:
129 case GDIOBJ_PALETTE:
130 case GDIOBJ_FONT:
131 case USEROBJ_ACCEL:
132 default:
133 break;
134 }
135 return GDIOBJ_NONE;
136}
137//******************************************************************************
138//******************************************************************************
139int WIN32API GetObjectA( HGDIOBJ hObject, int size, void *lpBuffer)
140{
141 int rc;
142
143 dprintf(("GDI32: GetObject %X %X %X\n", hObject, size, lpBuffer));
144 if(lpBuffer == NULL)
145 { //return required size if buffer pointer == NULL
146 int objtype = GetObjectType(hObject);
147 switch(objtype)
148 {
149 case OBJ_PEN:
150 return sizeof(LOGPEN);
151
152 case OBJ_EXTPEN:
153 return sizeof(EXTLOGPEN);
154
155 case OBJ_BRUSH:
156 return sizeof(LOGBRUSH);
157
158 case OBJ_PAL:
159 return sizeof(USHORT);
160
161 case OBJ_FONT:
162 return sizeof(LOGFONTA);
163
164 case OBJ_BITMAP:
165 return sizeof(BITMAP); //also default for dib sections??? (TODO: NEED TO CHECK THIS)
166
167 case OBJ_DC:
168 case OBJ_METADC:
169 case OBJ_REGION:
170 case OBJ_METAFILE:
171 case OBJ_MEMDC:
172 case OBJ_ENHMETADC:
173 case OBJ_ENHMETAFILE:
174 dprintf(("warning: GetObjectA not defined for object type %d", objtype));
175 return 0;
176 }
177 }
178 if(DIBSection::getSection() != NULL)
179 {
180 DIBSection *dsect = DIBSection::findObj(hObject);
181 if(dsect)
182 {
183 rc = dsect->GetDIBSection(size, lpBuffer);
184 if(rc == 0) {
185 SetLastError(ERROR_INVALID_PARAMETER);
186 return 0;
187 }
188 SetLastError(ERROR_SUCCESS);
189 return rc;
190 }
191 }
192
193 return O32_GetObject(hObject, size, lpBuffer);
194}
195//******************************************************************************
196//******************************************************************************
197int WIN32API GetObjectW( HGDIOBJ hObject, int size, void *lpBuffer)
198{
199 int ret, objtype;
200
201 dprintf(("GDI32: GetObjectW %X, %d %X", hObject, size, lpBuffer));
202 objtype = GetObjectType(hObject);
203
204 switch(objtype)
205 {
206 case OBJ_FONT:
207 {
208 LOGFONTA logfonta;
209
210 if(lpBuffer == NULL) {
211 return sizeof(LOGFONTW); //return required size if buffer pointer == NULL
212 }
213 ret = GetObjectA(hObject, sizeof(logfonta), (void *)&logfonta);
214 if(ret == sizeof(logfonta))
215 {
216 LOGFONTW *logfontw = (LOGFONTW *)lpBuffer;
217
218 if(size < sizeof(LOGFONTW)) {
219 dprintf(("GDI32: GetObjectW : buffer not big enough for LOGFONTW struct!!")); //is the correct? or copy only part?
220 return 0;
221 }
222 memcpy(logfontw, &logfonta, sizeof(LOGFONTA));
223 memset(logfontw->lfFaceName, 0, LF_FACESIZE);
224 AsciiToUnicodeN(logfonta.lfFaceName, logfontw->lfFaceName, LF_FACESIZE-1);
225
226 return sizeof(LOGFONTW);
227 }
228 return 0;
229 }
230 default:
231 return GetObjectA(hObject, size, lpBuffer);
232 }
233}
234//******************************************************************************
235//******************************************************************************
236HGDIOBJ WIN32API SelectObject(HDC hdc, HGDIOBJ hObj)
237{
238 HGDIOBJ rc;
239 DWORD handleType = GetObjectType(hObj);
240
241 dprintf2(("GDI32: SelectObject %x %x type %x", hdc, hObj, handleType));
242
243 if(handleType == GDIOBJ_REGION) {
244 //Return complexity here; not previously selected clip region
245 return (HGDIOBJ)SelectClipRgn(hdc, hObj);
246 }
247
248 if(handleType == OBJ_BITMAP && DIBSection::getSection() != NULL)
249 {
250 DIBSection *dsect;
251
252 dsect = DIBSection::findHDC(hdc);
253 if(dsect)
254 {
255 //remove previously selected dibsection
256 dsect->UnSelectDIBObject();
257 }
258 dsect = DIBSection::findObj(hObj);
259 if(dsect)
260 {
261 dsect->SelectDIBObject(hdc);
262 }
263 }
264 rc = O32_SelectObject(hdc, hObj);
265 if(rc != 0 && GetObjectType(rc) == OBJ_BITMAP && DIBSection::getSection != NULL)
266 {
267 DIBSection *dsect = DIBSection::findObj(rc);
268 if(dsect)
269 {
270 dsect->UnSelectDIBObject();
271 }
272 }
273#ifdef USING_OPEN32
274 if(handleType == OBJ_BITMAP)
275 {
276 //SvL: Open32 messes up the height of the hdc (for windows)
277 pDCData pHps = (pDCData)OSLibGpiQueryDCData((HPS)hdc);
278 if(pHps && pHps->hwnd) {
279 dprintf2(("change back origin"));
280 selectClientArea(pHps);
281 setPageXForm(pHps);
282 }
283 }
284#endif
285 dprintf2(("GDI32: SelectObject %x %x returned %x", hdc, hObj, rc));
286
287 return(rc);
288}
289//******************************************************************************
290//Called from user32 ReleaseDC (for non CS_OWNDC hdcs)
291//******************************************************************************
292VOID WIN32API UnselectGDIObjects(HDC hdc)
293{
294 DIBSection *dsect;
295
296 dsect = DIBSection::findHDC(hdc);
297 if(dsect)
298 {
299 //remove previously selected dibsection
300 dsect->UnSelectDIBObject();
301 }
302}
303//******************************************************************************
304//******************************************************************************
305DWORD WIN32API GetObjectType( HGDIOBJ hObj)
306{
307 dprintf2(("GDI32: GetObjectType %x", hObj));
308 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
309 SetLastError(ERROR_SUCCESS);
310 return OBJ_REGION;
311 }
312 return O32_GetObjectType(hObj);
313}
314//******************************************************************************
315//TODO: System objects can't be deleted (TODO: any others?? (fonts?))!!!!)
316//******************************************************************************
317BOOL WIN32API DeleteObject(HANDLE hObj)
318{
319 DWORD type;
320
321 dprintf(("GDI32: DeleteObject %x", hObj));
322
323 //System objects can't be deleted (TODO: any others?? (fonts?))!!!!)
324 type = GetObjectType(hObj);
325 if(type == OBJ_PEN && IsSystemPen(hObj)) {
326 SetLastError(ERROR_SUCCESS);
327 return TRUE;
328 }
329 if(type == OBJ_BRUSH && IsSystemBrush(hObj)) {
330 SetLastError(ERROR_SUCCESS);
331 return TRUE;
332 }
333
334 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
335 OSLibDeleteRegion(ObjGetHandleData(hObj, GDIOBJ_REGION));
336 ObjFreeHandle(hObj);
337 SetLastError(ERROR_SUCCESS);
338 return TRUE;
339 }
340 DIBSection::deleteSection((DWORD)hObj);
341 return O32_DeleteObject(hObj);
342}
343//******************************************************************************
344//******************************************************************************
345BOOL WIN32API SetObjectOwner( HGDIOBJ arg1, int arg2 )
346{
347 // Here is a guess for a undocumented entry
348 dprintf(("WARNING: GDI32: SetObjectOwner - stub (TRUE)\n"));
349 return TRUE;
350}
351//******************************************************************************
352//******************************************************************************
Note: See TracBrowser for help on using the repository browser.