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

Last change on this file since 4562 was 4533, checked in by sandervl, 25 years ago

GetObjectA/W fixes

File size: 8.2 KB
Line 
1/* $Id: objhandle.cpp,v 1.5 2000-10-26 17:20:29 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 "dibsect.h"
22#include "region.h"
23
24#define DBG_LOCALLOG DBG_objhandle
25#include "dbglocal.h"
26
27//******************************************************************************
28
29static ULONG objHandleTable[MAX_OBJECT_HANDLES] = {0};
30static ULONG lowestFreeIndex = 0;
31static VMutex objTableMutex;
32
33//******************************************************************************
34//******************************************************************************
35BOOL ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, ObjectType type)
36{
37 objTableMutex.enter(VMUTEX_WAIT_FOREVER);
38 if(lowestFreeIndex == -1) {
39 //oops, out of handles
40 dprintf(("ERROR: GDI: HwAllocateWindowHandle OUT OF GDI OBJECT HANDLES!!"));
41 objTableMutex.leave();
42 DebugInt3();
43 return FALSE;
44 }
45 *hObject = lowestFreeIndex;
46 *hObject |= MAKE_HANDLE(type);
47 objHandleTable[lowestFreeIndex] = dwUserData;
48
49 lowestFreeIndex = -1;
50
51 //find next free handle
52 for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
53 if(objHandleTable[i] == 0) {
54 lowestFreeIndex = i;
55 break;
56 }
57 }
58 objTableMutex.leave();
59 return TRUE;
60}
61//******************************************************************************
62//******************************************************************************
63void ObjFreeHandle(HANDLE hObject)
64{
65 hObject &= OBJHANDLE_MAGIC_MASK;
66 if(hObject < MAX_OBJECT_HANDLES) {
67 objTableMutex.enter(VMUTEX_WAIT_FOREVER);
68 objHandleTable[hObject] = 0;
69 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
70 lowestFreeIndex = hObject;
71
72 objTableMutex.leave();
73 }
74}
75//******************************************************************************
76//******************************************************************************
77DWORD ObjGetHandleData(HANDLE hObject)
78{
79 switch(GET_OBJTYPE(hObject))
80 {
81 case GDIOBJ_REGION:
82 break;
83 //case GDIOBJ_BITMAP
84 //case GDIOBJ_BRUSH
85 //case GDIOBJ_PALETTE
86 //case GDIOBJ_FONT
87 default:
88 return HANDLE_OBJ_ERROR;
89 }
90
91 hObject &= OBJHANDLE_MAGIC_MASK;
92 if(hObject < MAX_OBJECT_HANDLES) {
93 return objHandleTable[hObject];
94 }
95 return HANDLE_OBJ_ERROR;
96}
97//******************************************************************************
98//******************************************************************************
99ObjectType ObjGetHandleType(HANDLE hObject)
100{
101 switch(GET_OBJTYPE(hObject))
102 {
103 case GDIOBJ_REGION:
104 return GDIOBJ_REGION;
105 //case GDIOBJ_BITMAP
106 //case GDIOBJ_BRUSH
107 //case GDIOBJ_PALETTE
108 //case GDIOBJ_FONT
109 default:
110 return GDIOBJ_ERROR;
111 }
112}
113//******************************************************************************
114//******************************************************************************
115int WIN32API GetObjectA( HGDIOBJ hObject, int size, void *lpBuffer)
116{
117 int rc;
118
119 dprintf(("GDI32: GetObject %X %X %X\n", hObject, size, lpBuffer));
120 if(lpBuffer == NULL)
121 { //return required size if buffer pointer == NULL
122 int objtype = GetObjectType(hObject);
123 switch(objtype)
124 {
125 case OBJ_PEN:
126 return sizeof(LOGPEN);
127
128 case OBJ_EXTPEN:
129 return sizeof(EXTLOGPEN);
130
131 case OBJ_BRUSH:
132 return sizeof(LOGBRUSH);
133
134 case OBJ_PAL:
135 return sizeof(USHORT);
136
137 case OBJ_FONT:
138 return sizeof(LOGFONTA);
139
140 case OBJ_BITMAP:
141 return sizeof(BITMAP); //also default for dib sections??? (TODO: NEED TO CHECK THIS)
142
143 case OBJ_DC:
144 case OBJ_METADC:
145 case OBJ_REGION:
146 case OBJ_METAFILE:
147 case OBJ_MEMDC:
148 case OBJ_ENHMETADC:
149 case OBJ_ENHMETAFILE:
150 dprintf(("warning: GetObjectA not defined for object type %d", objtype));
151 return 0;
152 }
153 }
154 if(DIBSection::getSection() != NULL)
155 {
156 DIBSection *dsect = DIBSection::find(hObject);
157 if(dsect)
158 {
159 rc = dsect->GetDIBSection(size, lpBuffer);
160 if(rc == 0) {
161 SetLastError(ERROR_INVALID_PARAMETER);
162 return 0;
163 }
164 SetLastError(ERROR_SUCCESS);
165 return rc;
166 }
167 }
168
169 return O32_GetObject(hObject, size, lpBuffer);
170}
171//******************************************************************************
172//******************************************************************************
173int WIN32API GetObjectW( HGDIOBJ hObject, int size, void *lpBuffer)
174{
175 int ret, objtype;
176
177 dprintf(("GDI32: GetObjectW %X, %d %X", hObject, size, lpBuffer));
178 objtype = GetObjectType(hObject);
179
180 switch(objtype)
181 {
182 case OBJ_FONT:
183 {
184 LOGFONTA logfonta;
185
186 if(lpBuffer == NULL) {
187 return sizeof(LOGFONTW); //return required size if buffer pointer == NULL
188 }
189 ret = GetObjectA(hObject, sizeof(logfonta), (void *)&logfonta);
190 if(ret == sizeof(logfonta))
191 {
192 LOGFONTW *logfontw = (LOGFONTW *)lpBuffer;
193
194 if(size < sizeof(LOGFONTW)) {
195 dprintf(("GDI32: GetObjectW : buffer not big enough for LOGFONTW struct!!")); //is the correct? or copy only part?
196 return 0;
197 }
198 memcpy(logfontw, &logfonta, sizeof(LOGFONTA));
199 memset(logfontw->lfFaceName, 0, LF_FACESIZE);
200 AsciiToUnicodeN(logfonta.lfFaceName, logfontw->lfFaceName, LF_FACESIZE-1);
201
202 return sizeof(LOGFONTW);
203 }
204 return 0;
205 }
206 default:
207 return GetObjectA(hObject, size, lpBuffer);
208 }
209}
210//******************************************************************************
211//******************************************************************************
212HGDIOBJ WIN32API SelectObject(HDC hdc, HGDIOBJ hObj)
213{
214 HGDIOBJ rc;
215
216 dprintf2(("GDI32: SelectObject %x %x", hdc, hObj));
217
218 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
219 //Return complexity here; not previously selected clip region
220 return (HGDIOBJ)SelectClipRgn(hdc, hObj);
221 }
222
223 if(DIBSection::getSection() != NULL)
224 {
225 DIBSection *dsect;
226
227 dsect = DIBSection::find(hdc);
228 if(dsect)
229 {
230 //remove previously selected dibsection
231 dsect->UnSelectDIBObject();
232 }
233 dsect = DIBSection::find((DWORD)hObj);
234 if(dsect)
235 {
236 dsect->SelectDIBObject(hdc);
237 }
238 }
239 rc = O32_SelectObject(hdc, hObj);
240 if(rc != 0 && DIBSection::getSection != NULL)
241 {
242 DIBSection *dsect = DIBSection::find((DWORD)rc);
243 if(dsect)
244 {
245 dsect->UnSelectDIBObject();
246 }
247 }
248 return(rc);
249}
250//******************************************************************************
251//******************************************************************************
252DWORD WIN32API GetObjectType( HGDIOBJ hObj)
253{
254 dprintf2(("GDI32: GetObjectType\n"));
255 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
256 SetLastError(ERROR_SUCCESS);
257 return OBJ_REGION;
258 }
259 return O32_GetObjectType(hObj);
260}
261//******************************************************************************
262//******************************************************************************
263BOOL WIN32API DeleteObject(HANDLE hObj)
264{
265 dprintf(("GDI32: DeleteObject %x", hObj));
266 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
267 OSLibDeleteRegion(ObjGetHandleData(hObj));
268 ObjFreeHandle(hObj);
269 SetLastError(ERROR_SUCCESS);
270 return OBJ_REGION;
271 }
272 DIBSection::deleteSection((DWORD)hObj);
273 return O32_DeleteObject(hObj);
274}
275//******************************************************************************
276//******************************************************************************
277BOOL WIN32API SetObjectOwner( HGDIOBJ arg1, int arg2 )
278{
279 // Here is a guess for a undocumented entry
280 dprintf(("WARNING: GDI32: SetObjectOwner - stub (TRUE)\n"));
281 return TRUE;
282}
283//******************************************************************************
284//******************************************************************************
Note: See TracBrowser for help on using the repository browser.