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

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

(Ext)SelectClipRgn fixes

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