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

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

minor logging update

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