Changeset 8871 for trunk/src/gdi32/objhandle.cpp
- Timestamp:
- Jul 15, 2002, 12:02:30 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gdi32/objhandle.cpp
r8202 r8871 1 /* $Id: objhandle.cpp,v 1.2 1 2002-04-07 14:38:08sandervl Exp $ */1 /* $Id: objhandle.cpp,v 1.22 2002-07-15 10:02:29 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Handle Management Code for OS/2 4 4 * 5 5 * 6 * Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 6 * Copyright 2000-2002 Sander van Leeuwen (sandervl@xs4all.nl) 8 7 * 9 8 * TODO: The table should be dynamically increased when necessary 10 9 * This is just a quick and dirty implementation 10 * 11 * System objects can't be deleted (TODO: any others?? (fonts?))!!!!) 11 12 * 12 13 * Project Odin Software License can be found in LICENSE.TXT … … 37 38 38 39 typedef struct { 39 ULONG dwUserData; 40 ObjectType type; 40 DWORD dwUserData; 41 DWORD dwGDI32Data; 42 DWORD dwFlags; 43 DWORD dwType; 41 44 } GdiObject; 42 45 … … 45 48 static VMutex objTableMutex; 46 49 47 #ifdef DEBUG 48 static DWORD GetObjectTypeNoDbg( HGDIOBJ hObj); 49 #else 50 #define GetObjectTypeNoDbg GetObjectType 51 #endif 52 53 //****************************************************************************** 54 //****************************************************************************** 55 BOOL WIN32API ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, ObjectType type) 50 //****************************************************************************** 51 //****************************************************************************** 52 BOOL WIN32API ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, DWORD dwType) 56 53 { 57 54 objTableMutex.enter(); … … 63 60 return FALSE; 64 61 } 65 if(objHandleTable[0]. type == 0) {62 if(objHandleTable[0].dwType == HNDL_NONE) { 66 63 //first handle can never be used 67 objHandleTable[0]. type = GDIOBJ_INVALID;64 objHandleTable[0].dwType = HNDL_INVALID; 68 65 objHandleTable[0].dwUserData = -1; 69 66 } 70 *hObject = lowestFreeIndex; 71 *hObject |= MAKE_HANDLE(type); 72 objHandleTable[lowestFreeIndex].dwUserData = dwUserData; 73 objHandleTable[lowestFreeIndex].type = type; 74 67 *hObject = lowestFreeIndex; 68 *hObject = MAKE_HANDLE(*hObject); 69 objHandleTable[lowestFreeIndex].dwUserData = dwUserData; 70 objHandleTable[lowestFreeIndex].dwType = dwType; 71 objHandleTable[lowestFreeIndex].dwGDI32Data = 0; 72 objHandleTable[lowestFreeIndex].dwFlags = 0; 75 73 lowestFreeIndex = -1; 76 74 … … 87 85 //****************************************************************************** 88 86 //****************************************************************************** 89 void WIN32API ObjFreeHandle(HANDLE hObject)87 BOOL WIN32API ObjDeleteHandle(HANDLE hObject, DWORD dwType) 90 88 { 91 89 hObject &= OBJHANDLE_MAGIC_MASK; 92 90 if(hObject < MAX_OBJECT_HANDLES) { 93 91 objTableMutex.enter(); 94 objHandleTable[hObject].dwUserData = 0; 95 objHandleTable[hObject].type = GDIOBJ_NONE; 96 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex) 97 lowestFreeIndex = hObject; 98 92 if(!(objHandleTable[hObject].dwFlags & OBJHANDLE_FLAG_NODELETE)) 93 { 94 objHandleTable[hObject].dwUserData = 0; 95 objHandleTable[hObject].dwType = HNDL_NONE; 96 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex) 97 lowestFreeIndex = hObject; 98 } 99 else { 100 dprintf(("ObjDeleteHandle: unable to delete system object %x", MAKE_HANDLE(hObject))); 101 } 99 102 objTableMutex.leave(); 100 } 101 } 102 //****************************************************************************** 103 //****************************************************************************** 104 DWORD WIN32API ObjGetHandleData(HANDLE hObject, ObjectType type) 105 { 106 hObject &= OBJHANDLE_MAGIC_MASK; 107 if(hObject < MAX_OBJECT_HANDLES && type == objHandleTable[hObject].type) { 108 return objHandleTable[hObject].dwUserData; 109 } 110 return HANDLE_OBJ_ERROR; 111 } 112 //****************************************************************************** 113 //****************************************************************************** 114 ObjectType WIN32API ObjGetHandleType(HANDLE hObject) 115 { 116 DWORD objtype; 117 118 switch(OBJHANDLE_MAGIC(hObject)) 119 { 120 case GDIOBJ_REGION: 121 hObject &= OBJHANDLE_MAGIC_MASK; 122 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].type == GDIOBJ_REGION) { 123 return GDIOBJ_REGION; 124 } 125 break; 126 127 case USEROBJ_MENU: 128 hObject &= OBJHANDLE_MAGIC_MASK; 129 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].type == USEROBJ_MENU) { 130 return USEROBJ_MENU; 131 } 132 break; 133 134 case GDIOBJ_NONE: 135 //could be a cutoff menu handle, check this 136 //TODO: dangerous assumption! (need to rewrite object handle management) 137 hObject &= OBJHANDLE_MAGIC_MASK; 138 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwUserData != 0 && objHandleTable[hObject].type == USEROBJ_MENU) { 139 return USEROBJ_MENU; 140 } 141 break; 142 143 case GDIOBJ_BITMAP: 144 case GDIOBJ_BRUSH: 145 case GDIOBJ_PALETTE: 146 case GDIOBJ_FONT: 147 case USEROBJ_ACCEL: 148 default: 149 break; 150 } 151 return GDIOBJ_NONE; 103 return TRUE; 104 } 105 return FALSE; 106 } 107 //****************************************************************************** 108 //****************************************************************************** 109 DWORD WIN32API ObjQueryHandleData(HANDLE hObject, DWORD dwType) 110 { 111 DWORD dwUserData = HANDLE_INVALID_DATA; 112 113 objTableMutex.enter(); 114 hObject &= OBJHANDLE_MAGIC_MASK; 115 if(hObject < MAX_OBJECT_HANDLES && 116 ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) || 117 dwType == objHandleTable[hObject].dwType)) 118 { 119 dwUserData = objHandleTable[hObject].dwUserData; 120 } 121 objTableMutex.leave(); 122 return dwUserData; 123 } 124 //****************************************************************************** 125 //****************************************************************************** 126 BOOL WIN32API ObjSetHandleData(HANDLE hObject, DWORD dwType, DWORD dwUserData) 127 { 128 BOOL fSuccess = FALSE; 129 130 objTableMutex.enter(); 131 hObject &= OBJHANDLE_MAGIC_MASK; 132 if(hObject < MAX_OBJECT_HANDLES && 133 ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) || 134 dwType == objHandleTable[hObject].dwType)) 135 { 136 objHandleTable[hObject].dwUserData = dwUserData; 137 fSuccess = TRUE; 138 } 139 objTableMutex.leave(); 140 return fSuccess; 141 } 142 //****************************************************************************** 143 //****************************************************************************** 144 DWORD WIN32API ObjQueryHandleGDI32Data(HANDLE hObject, DWORD dwType) 145 { 146 DWORD dwGDI32Data = HANDLE_INVALID_DATA; 147 148 objTableMutex.enter(); 149 hObject &= OBJHANDLE_MAGIC_MASK; 150 if(hObject < MAX_OBJECT_HANDLES && 151 ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) || 152 dwType == objHandleTable[hObject].dwType)) 153 { 154 dwGDI32Data = objHandleTable[hObject].dwGDI32Data; 155 } 156 objTableMutex.leave(); 157 return dwGDI32Data; 158 } 159 //****************************************************************************** 160 //****************************************************************************** 161 BOOL WIN32API ObjSetHandleGDI32Data(HANDLE hObject, DWORD dwType, DWORD dwGDI32Data) 162 { 163 BOOL fSuccess = FALSE; 164 165 objTableMutex.enter(); 166 hObject &= OBJHANDLE_MAGIC_MASK; 167 if(hObject < MAX_OBJECT_HANDLES && 168 ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) || 169 dwType == objHandleTable[hObject].dwType)) 170 { 171 objHandleTable[hObject].dwGDI32Data = dwGDI32Data; 172 fSuccess = TRUE; 173 } 174 objTableMutex.leave(); 175 return fSuccess; 176 } 177 //****************************************************************************** 178 //****************************************************************************** 179 DWORD WIN32API ObjQueryHandleFlags(OBJHANDLE hObject) 180 { 181 DWORD dwFlags = HANDLE_INVALID_DATA; 182 183 objTableMutex.enter(); 184 hObject &= OBJHANDLE_MAGIC_MASK; 185 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE) 186 { 187 dwFlags = objHandleTable[hObject].dwFlags; 188 } 189 objTableMutex.leave(); 190 return dwFlags; 191 } 192 //****************************************************************************** 193 //****************************************************************************** 194 BOOL WIN32API ObjSetHandleFlag(HANDLE hObject, DWORD dwFlag, BOOL fSet) 195 { 196 BOOL fSuccess = FALSE; 197 198 objTableMutex.enter(); 199 hObject &= OBJHANDLE_MAGIC_MASK; 200 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE) { 201 if(fSet) { 202 objHandleTable[hObject].dwFlags |= dwFlag; 203 } 204 else objHandleTable[hObject].dwFlags &= ~dwFlag; 205 206 dprintf(("ObjSetHandleFlag %x -> %x", MAKE_HANDLE(hObject), dwFlag)); 207 208 fSuccess = TRUE; 209 } 210 objTableMutex.leave(); 211 return fSuccess; 212 } 213 //****************************************************************************** 214 //****************************************************************************** 215 DWORD WIN32API ObjQueryHandleType(HANDLE hObject) 216 { 217 DWORD objtype = 0; 218 219 objTableMutex.enter(); 220 hObject &= OBJHANDLE_MAGIC_MASK; 221 if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE) { 222 objtype = objHandleTable[hObject].dwType; 223 } 224 objTableMutex.leave(); 225 return objtype; 152 226 } 153 227 //****************************************************************************** … … 155 229 int WIN32API GetObjectA( HGDIOBJ hObject, int size, void *lpBuffer) 156 230 { 157 int rc; 158 159 dprintf(("GDI32: GetObject %X %X %X\n", hObject, size, lpBuffer)); 160 //TODO: must use 16 bits gdi object handles 161 if(HIWORD(hObject) == 0) { 162 hObject |= GDIOBJ_PREFIX; 163 } 164 if(lpBuffer == NULL) 165 { //return required size if buffer pointer == NULL 166 int objtype = GetObjectTypeNoDbg(hObject); 167 switch(objtype) 168 { 169 case OBJ_PEN: 170 return sizeof(LOGPEN); 171 172 case OBJ_EXTPEN: 173 return sizeof(EXTLOGPEN); 174 175 case OBJ_BRUSH: 176 return sizeof(LOGBRUSH); 177 178 case OBJ_PAL: 179 return sizeof(USHORT); 180 181 case OBJ_FONT: 182 return sizeof(LOGFONTA); 183 184 case OBJ_BITMAP: 185 return sizeof(BITMAP); //also default for dib sections??? (TODO: NEED TO CHECK THIS) 186 187 case OBJ_DC: 188 case OBJ_METADC: 189 case OBJ_REGION: 190 case OBJ_METAFILE: 191 case OBJ_MEMDC: 192 case OBJ_ENHMETADC: 193 case OBJ_ENHMETAFILE: 194 dprintf(("warning: GetObjectA not defined for object type %d", objtype)); 195 return 0; 196 } 197 } 198 if(DIBSection::getSection() != NULL) 199 { 231 int rc; 232 233 dprintf(("GDI32: GetObject %X %X %X\n", hObject, size, lpBuffer)); 234 235 if(lpBuffer == NULL) 236 { //return required size if buffer pointer == NULL 237 int objtype = GetObjectType(hObject); 238 switch(objtype) 239 { 240 case OBJ_PEN: 241 return sizeof(LOGPEN); 242 243 case OBJ_EXTPEN: 244 return sizeof(EXTLOGPEN); 245 246 case OBJ_BRUSH: 247 return sizeof(LOGBRUSH); 248 249 case OBJ_PAL: 250 return sizeof(USHORT); 251 252 case OBJ_FONT: 253 return sizeof(LOGFONTA); 254 255 case OBJ_BITMAP: 256 return sizeof(BITMAP); //also default for dib sections??? (TODO: NEED TO CHECK THIS) 257 258 case OBJ_DC: 259 case OBJ_METADC: 260 case OBJ_REGION: 261 case OBJ_METAFILE: 262 case OBJ_MEMDC: 263 case OBJ_ENHMETADC: 264 case OBJ_ENHMETAFILE: 265 dprintf(("warning: GetObjectA not defined for object type %d", objtype)); 266 return 0; 267 } 268 } 269 if(DIBSection::getSection() != NULL) 270 { 200 271 DIBSection *dsect = DIBSection::findObj(hObject); 201 272 if(dsect) 202 273 { 203 204 205 206 207 208 209 210 } 211 }212 213 return O32_GetObject(hObject, size, lpBuffer);274 rc = dsect->GetDIBSection(size, lpBuffer); 275 if(rc == 0) { 276 SetLastError(ERROR_INVALID_PARAMETER); 277 return 0; 278 } 279 SetLastError(ERROR_SUCCESS); 280 return rc; 281 } 282 } 283 284 return O32_GetObject(hObject, size, lpBuffer); 214 285 } 215 286 //****************************************************************************** … … 217 288 int WIN32API GetObjectW( HGDIOBJ hObject, int size, void *lpBuffer) 218 289 { 219 int ret, objtype; 220 221 dprintf(("GDI32: GetObjectW %X, %d %X", hObject, size, lpBuffer)); 222 223 //TODO: must use 16 bits gdi object handles 224 if(HIWORD(hObject) == 0) { 225 hObject |= GDIOBJ_PREFIX; 226 } 227 objtype = GetObjectTypeNoDbg(hObject); 228 229 switch(objtype) 230 { 231 case OBJ_FONT: 232 { 233 LOGFONTA logfonta; 290 int ret, objtype; 291 292 dprintf(("GDI32: GetObjectW %X, %d %X", hObject, size, lpBuffer)); 293 294 objtype = GetObjectType(hObject); 295 296 switch(objtype) 297 { 298 case OBJ_FONT: 299 { 300 LOGFONTA logfonta; 234 301 235 302 if(lpBuffer == NULL) { … … 252 319 } 253 320 return 0; 254 }255 default:256 return GetObjectA(hObject, size, lpBuffer);257 }321 } 322 default: 323 return GetObjectA(hObject, size, lpBuffer); 324 } 258 325 } 259 326 //****************************************************************************** … … 289 356 HGDIOBJ WIN32API SelectObject(HDC hdc, HGDIOBJ hObj) 290 357 { 291 HGDIOBJ rc;292 DWORD handleType;358 HGDIOBJ rc; 359 DWORD handleType; 293 360 294 361 //TODO: must use 16 bits gdi object handles … … 297 364 } 298 365 299 handleType = GetObjectType NoDbg(hObj);366 handleType = GetObjectType(hObj); 300 367 dprintf2(("GDI32: SelectObject %x %x type %s", hdc, hObj, DbgGetGDITypeName(handleType))); 301 if(handleType == GDIOBJ_REGION) {368 if(handleType == HNDL_REGION) { 302 369 //Return complexity here; not previously selected clip region 303 370 return (HGDIOBJ)SelectClipRgn(hdc, hObj); … … 321 388 } 322 389 rc = O32_SelectObject(hdc, hObj); 323 if(rc != 0 && GetObjectType NoDbg(rc) == OBJ_BITMAP && DIBSection::getSection != NULL)390 if(rc != 0 && GetObjectType(rc) == OBJ_BITMAP && DIBSection::getSection != NULL) 324 391 { 325 392 DIBSection *dsect = DIBSection::findObj(rc); … … 329 396 } 330 397 } 331 #ifdef USING_OPEN32332 if(handleType == OBJ_BITMAP)333 {334 //SvL: Open32 messes up the height of the hdc (for windows)335 pDCData pHps = (pDCData)OSLibGpiQueryDCData((HPS)hdc);336 if(pHps && pHps->hwnd) {337 dprintf2(("change back origin"));338 selectClientArea(pHps);339 setPageXForm(pHps);340 }341 }342 #endif343 398 dprintf2(("GDI32: SelectObject %x %x returned %x", hdc, hObj, rc)); 344 399 … … 361 416 //****************************************************************************** 362 417 //****************************************************************************** 363 #ifdef DEBUG 364 static DWORD GetObjectTypeNoDbg( HGDIOBJ hObj) 418 DWORD WIN32API GetObjectType( HGDIOBJ hObj) 419 { 420 DWORD objtype = ObjQueryHandleType(hObj); 421 422 switch(objtype) { 423 case HNDL_PEN: 424 objtype = OBJ_PEN; 425 break; 426 case HNDL_BRUSH: 427 objtype = OBJ_BRUSH; 428 break; 429 case HNDL_DC: 430 objtype = OBJ_DC; 431 break; 432 case HNDL_METADC: 433 objtype = OBJ_METADC; 434 break; 435 case HNDL_PALETTE: 436 objtype = OBJ_PAL; 437 break; 438 case HNDL_FONT: 439 objtype = OBJ_FONT; 440 break; 441 case HNDL_BITMAP: 442 case HNDL_DIBSECTION: 443 objtype = OBJ_BITMAP; 444 break; 445 case HNDL_REGION: 446 objtype = OBJ_REGION; 447 break; 448 case HNDL_METAFILE: 449 objtype = OBJ_METAFILE; 450 break; 451 case HNDL_ENHMETAFILE: 452 objtype = OBJ_ENHMETAFILE; 453 break; 454 case HNDL_MEMDC: 455 objtype = OBJ_MEMDC; 456 break; 457 case HNDL_EXTPEN: 458 objtype = OBJ_EXTPEN; 459 break; 460 case HNDL_ENHMETADC: 461 objtype = OBJ_ENHMETADC; 462 break; 463 default: 464 objtype = 0; 465 break; 466 } 467 dprintf2(("GDI32: GetObjectType %x objtype %d (%s)", hObj, objtype, DbgGetGDITypeName(objtype))); 468 return objtype; 469 } 470 //****************************************************************************** 471 //TODO: System objects can't be deleted (TODO: any others?? (fonts?))!!!!) 472 //****************************************************************************** 473 BOOL WIN32API DeleteObject(HANDLE hObj) 365 474 { 366 475 DWORD objtype; 367 476 368 //TODO: must use 16 bits gdi object handles369 if(HIWORD(hObj) == 0) {370 hObj |= GDIOBJ_PREFIX;371 }372 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {373 dprintf2(("GDI32: GetObjectType %x REGION", hObj));374 SetLastError(ERROR_SUCCESS);375 return OBJ_REGION;376 }377 return O32_GetObjectType(hObj);378 }379 #endif380 //******************************************************************************381 //******************************************************************************382 DWORD WIN32API GetObjectType( HGDIOBJ hObj)383 {384 DWORD objtype;385 386 //TODO: must use 16 bits gdi object handles387 if(HIWORD(hObj) == 0) {388 hObj |= GDIOBJ_PREFIX;389 }390 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {391 dprintf2(("GDI32: GetObjectType %x REGION", hObj));392 SetLastError(ERROR_SUCCESS);393 return OBJ_REGION;394 }395 objtype = O32_GetObjectType(hObj);396 dprintf2(("GDI32: GetObjectType %x objtype %d", hObj, objtype));397 return objtype;398 }399 //******************************************************************************400 //TODO: System objects can't be deleted (TODO: any others?? (fonts?))!!!!)401 //******************************************************************************402 BOOL WIN32API DeleteObject(HANDLE hObj)403 {404 DWORD objtype;405 406 477 dprintf(("GDI32: DeleteObject %x", hObj)); 407 478 408 //TODO: must use 16 bits gdi object handles409 if(HIWORD(hObj) == 0)410 {411 hObj |= GDIOBJ_PREFIX;412 }413 414 //System objects can't be deleted (TODO: any others?? (fonts?))!!!!)415 objtype = GetObjectTypeNoDbg(hObj);416 switch (objtype)417 {418 case OBJ_PEN:419 if(IsSystemPen(hObj))420 {421 SetLastError(ERROR_SUCCESS);422 return TRUE;423 }424 else425 break;426 427 case OBJ_BRUSH:428 if(IsSystemBrush(hObj))429 {430 SetLastError(ERROR_SUCCESS);431 return TRUE;432 }433 else434 break;435 436 case OBJ_FONT:437 if(IsSystemFont(hObj))438 {439 SetLastError(ERROR_SUCCESS);440 return TRUE;441 }442 else443 break;444 445 // add more system-type objects as required ...446 }447 448 479 STATS_DeleteObject(hObj, objtype); 449 480 450 if(Obj GetHandleType(hObj) == GDIOBJ_REGION)451 { 452 OSLibDeleteRegion(Obj GetHandleData(hObj, GDIOBJ_REGION));453 Obj FreeHandle(hObj);481 if(ObjQueryHandleType(hObj) == HNDL_REGION) 482 { 483 OSLibDeleteRegion(ObjQueryHandleData(hObj, HNDL_REGION)); 484 ObjDeleteHandle(hObj, HNDL_REGION); 454 485 SetLastError(ERROR_SUCCESS); 455 486 return TRUE;
Note:
See TracChangeset
for help on using the changeset viewer.