source: trunk/src/gdi32/objhandle.cpp

Last change on this file was 21916, checked in by dmik, 14 years ago

Merge branch gcc-kmk to trunk.

File size: 20.6 KB
RevLine 
[10374]1/* $Id: objhandle.cpp,v 1.32 2004-01-11 11:42:18 sandervl Exp $ */
[3705]2/*
3 * Win32 Handle Management Code for OS/2
4 *
5 *
[8871]6 * Copyright 2000-2002 Sander van Leeuwen (sandervl@xs4all.nl)
[10374]7 * Copyright 2003 Innotek Systemberatung GmbH (sandervl@innotek.de)
[3705]8 *
9 * TODO: The table should be dynamically increased when necessary
[4533]10 * This is just a quick and dirty implementation
11 *
[8871]12 * System objects can't be deleted (TODO: any others?? (fonts?))!!!!)
13 *
[3705]14 * Project Odin Software License can be found in LICENSE.TXT
15 *
16 */
17
18#include <os2win.h>
[4533]19#include <stdlib.h>
20#include <string.h>
[3705]21#include <vmutex.h>
22#include <objhandle.h>
[4596]23#include <dcdata.h>
24#include <winuser32.h>
25#include "oslibgpi.h"
[3705]26#include "dibsect.h"
27#include "region.h"
[5472]28#include <unicode.h>
[7330]29#include "font.h"
[7635]30#include <stats.h>
[3705]31
[4533]32#define DBG_LOCALLOG DBG_objhandle
[3705]33#include "dbglocal.h"
34
[6163]35//TODO: must use 16 bits gdi object handles
36#define GDIOBJ_PREFIX 0xe7000000
37
[3705]38//******************************************************************************
39
[10374]40typedef struct _GdiObject
41{
42 DWORD dwUserData;
43 DWORD dwGDI32Data;
44 DWORD dwFlags;
45 DWORD dwType;
46#ifdef DEBUG
47 DWORD dwTime;
48 struct _GdiObject *prev;
49#endif
50 struct _GdiObject *next;
[4755]51} GdiObject;
[3705]52
[21524]53typedef struct
[10374]54{
55 GdiObject *headfree;
56 GdiObject *tailfree;
57 GdiObject *objects;
58 int iAllocated;
59#ifdef DEBUG
60 DWORD dwMaxAllocated;
61#endif
62} GdiObjectTable;
[4755]63
[10374]64static GdiObjectTable objHandleTable = { 0 };
65static VMutex objTableMutex;
66
[3705]67//******************************************************************************
68//******************************************************************************
[8871]69BOOL WIN32API ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, DWORD dwType)
[3705]70{
[9251]71 DWORD oldlowestidx;
[10374]72 BOOL retry = FALSE;
[9251]73
[8202]74 objTableMutex.enter();
[21524]75 if(objHandleTable.objects == NULL)
[10374]76 {
77 objHandleTable.objects = (GdiObject *)malloc(MAX_OBJECT_HANDLES*sizeof(GdiObject));
78 if(objHandleTable.objects == NULL) {
[8875]79 DebugInt3();
[10374]80 return FALSE;
[8875]81 }
[10374]82 memset(objHandleTable.objects, 0, MAX_OBJECT_HANDLES*sizeof(GdiObject));
83 if(objHandleTable.objects[0].dwType == HNDL_NONE) {
84 //first handle can never be used
85 objHandleTable.objects[0].dwType = HNDL_INVALID;
86 objHandleTable.objects[0].dwUserData = -1;
87 objHandleTable.objects[0].dwFlags = OBJHANDLE_FLAG_NODELETE;
88 }
89 objHandleTable.tailfree = &objHandleTable.objects[MAX_OBJECT_HANDLES-1];
[21524]90 for(int i=MAX_OBJECT_HANDLES-1;i>0;i--)
[10374]91 {
92 GdiObject *obj = &objHandleTable.objects[i];
93
94#ifdef DEBUG
95 if(objHandleTable.headfree) {
96 objHandleTable.headfree->prev = obj;
97 }
98 obj->prev = NULL;
99#endif
100 obj->next = objHandleTable.headfree;
101 objHandleTable.headfree = obj;
102 }
103 objHandleTable.iAllocated = 1; //one invalid object
[8875]104 }
105
[10374]106 GdiObject *newobj = objHandleTable.headfree;
107 if(newobj == NULL) {
[4755]108 //oops, out of handles
109 objTableMutex.leave();
[4769]110 dprintf(("ERROR: GDI: ObjAllocateHandle OUT OF GDI OBJECT HANDLES!!"));
[4755]111 DebugInt3();
112 return FALSE;
113 }
[10374]114 objHandleTable.headfree = newobj->next;
115 //if there's nothing left, then there's nothing left
116 if(objHandleTable.headfree == NULL) {
117 dprintf(("WARNING: Just allocated our last GDI handle..."));
118 objHandleTable.tailfree = NULL;
[6262]119 }
[10374]120#ifdef DEBUG
121 else objHandleTable.headfree->prev = NULL;
122 newobj->prev = NULL;
123 newobj->dwTime = GetCurrentTime();
124#endif
[9251]125
[10374]126 newobj->next = NULL;
[9251]127
[10374]128 *hObject = MAKE_HANDLE(((char *)newobj - (char *)objHandleTable.objects)/sizeof(*newobj));
129 newobj->dwUserData = dwUserData;
130 newobj->dwType = dwType;
131 newobj->dwGDI32Data = 0;
132 newobj->dwFlags = 0;
[3705]133
[10374]134 objHandleTable.iAllocated++;
135#ifdef DEBUG
136 if(objHandleTable.iAllocated > objHandleTable.dwMaxAllocated) {
137 objHandleTable.dwMaxAllocated = objHandleTable.iAllocated;
[4533]138 }
[10374]139#endif
[4755]140 objTableMutex.leave();
[10374]141 dprintf2(("ObjAllocateHandle %x type %d", *hObject, dwType));
[4755]142 return TRUE;
[3705]143}
144//******************************************************************************
145//******************************************************************************
[8871]146BOOL WIN32API ObjDeleteHandle(HANDLE hObject, DWORD dwType)
[3705]147{
[4755]148 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]149 if(hObject < MAX_OBJECT_HANDLES)
[10374]150 {
[8202]151 objTableMutex.enter();
[10374]152 GdiObject *obj = &objHandleTable.objects[hObject];
[21524]153 if(!(obj->dwFlags & OBJHANDLE_FLAG_NODELETE))
[8871]154 {
[10374]155 dprintf2(("ObjDeleteHandle %x type %d", MAKE_HANDLE(hObject), obj->dwType));
156
157 obj->dwUserData = 0;
158 obj->dwType = HNDL_NONE;
159 obj->next = NULL;
160
161 //add to the tail of the free object list
[21524]162 if(objHandleTable.tailfree)
[10374]163 objHandleTable.tailfree->next = obj;
164
165#ifdef DEBUG
166 obj->prev = objHandleTable.tailfree;
167#endif
168 objHandleTable.tailfree = obj;
169 if(objHandleTable.headfree == NULL)
170 objHandleTable.headfree = obj;
171
172 objHandleTable.iAllocated--;
173 if(objHandleTable.iAllocated < 0) DebugInt3();
[8871]174 }
175 else {
176 dprintf(("ObjDeleteHandle: unable to delete system object %x", MAKE_HANDLE(hObject)));
177 }
[4755]178 objTableMutex.leave();
[8871]179 return TRUE;
[4755]180 }
[8871]181 return FALSE;
[3705]182}
183//******************************************************************************
184//******************************************************************************
[8871]185DWORD WIN32API ObjQueryHandleData(HANDLE hObject, DWORD dwType)
[3705]186{
[8871]187 DWORD dwUserData = HANDLE_INVALID_DATA;
188
189 objTableMutex.enter();
[4755]190 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]191 if(hObject < MAX_OBJECT_HANDLES &&
192 ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
193 dwType == objHandleTable.objects[hObject].dwType))
[8871]194 {
[10374]195 dwUserData = objHandleTable.objects[hObject].dwUserData;
[4755]196 }
[8871]197 objTableMutex.leave();
198 return dwUserData;
[3705]199}
200//******************************************************************************
201//******************************************************************************
[8871]202BOOL WIN32API ObjSetHandleData(HANDLE hObject, DWORD dwType, DWORD dwUserData)
[3705]203{
[8871]204 BOOL fSuccess = FALSE;
[4767]205
[8871]206 objTableMutex.enter();
207 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]208 if(hObject < MAX_OBJECT_HANDLES &&
209 ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
210 dwType == objHandleTable.objects[hObject].dwType))
[4767]211 {
[10374]212 objHandleTable.objects[hObject].dwUserData = dwUserData;
[8871]213 fSuccess = TRUE;
214 }
215 objTableMutex.leave();
216 return fSuccess;
217}
218//******************************************************************************
219//******************************************************************************
220DWORD WIN32API ObjQueryHandleGDI32Data(HANDLE hObject, DWORD dwType)
221{
222 DWORD dwGDI32Data = HANDLE_INVALID_DATA;
[4767]223
[8871]224 objTableMutex.enter();
225 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]226 if(hObject < MAX_OBJECT_HANDLES &&
227 ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
228 dwType == objHandleTable.objects[hObject].dwType))
[8871]229 {
[10374]230 dwGDI32Data = objHandleTable.objects[hObject].dwGDI32Data;
[8871]231 }
232 objTableMutex.leave();
233 return dwGDI32Data;
234}
235//******************************************************************************
236//******************************************************************************
237BOOL WIN32API ObjSetHandleGDI32Data(HANDLE hObject, DWORD dwType, DWORD dwGDI32Data)
238{
239 BOOL fSuccess = FALSE;
[4767]240
[8871]241 objTableMutex.enter();
242 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]243 if(hObject < MAX_OBJECT_HANDLES &&
244 ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
245 dwType == objHandleTable.objects[hObject].dwType))
[8871]246 {
[10374]247 objHandleTable.objects[hObject].dwGDI32Data = dwGDI32Data;
[8871]248 fSuccess = TRUE;
[4755]249 }
[8871]250 objTableMutex.leave();
251 return fSuccess;
[3705]252}
253//******************************************************************************
254//******************************************************************************
[8871]255DWORD WIN32API ObjQueryHandleFlags(OBJHANDLE hObject)
[3705]256{
[8907]257 DWORD dwFlags = 0;
[3705]258
[8871]259 objTableMutex.enter();
260 hObject &= OBJHANDLE_MAGIC_MASK;
[21524]261 if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE)
[4533]262 {
[10374]263 dwFlags = objHandleTable.objects[hObject].dwFlags;
[8871]264 }
265 objTableMutex.leave();
266 return dwFlags;
267}
268//******************************************************************************
269//******************************************************************************
270BOOL WIN32API ObjSetHandleFlag(HANDLE hObject, DWORD dwFlag, BOOL fSet)
271{
272 BOOL fSuccess = FALSE;
[4533]273
[8871]274 objTableMutex.enter();
275 hObject &= OBJHANDLE_MAGIC_MASK;
[10374]276 if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE) {
[8871]277 if(fSet) {
[10374]278 objHandleTable.objects[hObject].dwFlags |= dwFlag;
[8871]279 }
[10374]280 else objHandleTable.objects[hObject].dwFlags &= ~dwFlag;
[4533]281
[8871]282 dprintf(("ObjSetHandleFlag %x -> %x", MAKE_HANDLE(hObject), dwFlag));
[4533]283
[8871]284 fSuccess = TRUE;
285 }
286 objTableMutex.leave();
287 return fSuccess;
288}
289//******************************************************************************
290//******************************************************************************
291DWORD WIN32API ObjQueryHandleType(HANDLE hObject)
292{
[21524]293//hack alert
294 if(HIWORD(hObject) == 0x100)
295 {//most likely a DC handle
296 if(OSLibGpiQueryDCData(hObject) != NULL) {
297 return HNDL_DC;
298 }
299 }
300//end hack
301
[8871]302 DWORD objtype = 0;
[4533]303
[8871]304 objTableMutex.enter();
305 hObject &= OBJHANDLE_MAGIC_MASK;
[10374]306 if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE) {
307 objtype = objHandleTable.objects[hObject].dwType;
[8871]308 }
309 objTableMutex.leave();
310 return objtype;
311}
312//******************************************************************************
313//******************************************************************************
[10374]314#ifdef DEBUG
[21916]315void dumpObjectType(const char *szType, DWORD dwType)
[10374]316{
317 for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
318 if(objHandleTable.objects[i].dwUserData != 0 && objHandleTable.objects[i].dwType == dwType) {
319 dprintf(("%s object %x %x %x %x time %x", szType, MAKE_HANDLE(i), objHandleTable.objects[i].dwUserData, objHandleTable.objects[i].dwGDI32Data, objHandleTable.objects[i].dwFlags, objHandleTable.objects[i].dwTime));
320 }
321 }
322}
323//******************************************************************************
324//******************************************************************************
325void WIN32API ObjDumpObjects()
326{
327 dprintf(("Open object handles (%d, max %d): (time %x)", objHandleTable.iAllocated, objHandleTable.dwMaxAllocated, GetCurrentTime()));
328
329 dumpObjectType("HNDL_PEN", HNDL_PEN);
330 dumpObjectType("HNDL_BRUSH", HNDL_BRUSH);
331 dumpObjectType("HNDL_DC", HNDL_DC);
332 dumpObjectType("HNDL_METADC", HNDL_METADC);
333 dumpObjectType("HNDL_PALETTE", HNDL_PALETTE);
334 dumpObjectType("HNDL_FONT", HNDL_FONT);
335 dumpObjectType("HNDL_BITMAP", HNDL_BITMAP);
336 dumpObjectType("HNDL_DIBSECTION", HNDL_DIBSECTION);
337 dumpObjectType("HNDL_REGION", HNDL_REGION);
338 dumpObjectType("HNDL_METAFILE", HNDL_METAFILE);
339 dumpObjectType("HNDL_ENHMETAFILE", HNDL_ENHMETAFILE);
340 dumpObjectType("HNDL_MEMDC", HNDL_MEMDC);
341 dumpObjectType("HNDL_EXTPEN", HNDL_EXTPEN);
342 dumpObjectType("HNDL_ENHMETADC", HNDL_ENHMETADC);
343 dumpObjectType("HNDL_MENU", HNDL_MENU);
344 dumpObjectType("HNDL_ACCEL", HNDL_ACCEL);
345 dumpObjectType("HNDL_CURSORICON", HNDL_CURSORICON);
346 dumpObjectType("HNDL_DDELP", HNDL_DDELP);
347}
348#endif
349//******************************************************************************
350//******************************************************************************
[8871]351int WIN32API GetObjectA( HGDIOBJ hObject, int size, void *lpBuffer)
352{
353 int rc;
[21524]354
[8871]355 if(lpBuffer == NULL)
356 { //return required size if buffer pointer == NULL
357 int objtype = GetObjectType(hObject);
358 switch(objtype)
359 {
360 case OBJ_PEN:
361 return sizeof(LOGPEN);
[21524]362
[8871]363 case OBJ_EXTPEN:
364 return sizeof(EXTLOGPEN);
[21524]365
[8871]366 case OBJ_BRUSH:
367 return sizeof(LOGBRUSH);
[21524]368
[8871]369 case OBJ_PAL:
370 return sizeof(USHORT);
[21524]371
[8871]372 case OBJ_FONT:
373 return sizeof(LOGFONTA);
[21524]374
[8871]375 case OBJ_BITMAP:
376 return sizeof(BITMAP); //also default for dib sections??? (TODO: NEED TO CHECK THIS)
[21524]377
[8871]378 case OBJ_DC:
379 case OBJ_METADC:
380 case OBJ_REGION:
381 case OBJ_METAFILE:
382 case OBJ_MEMDC:
383 case OBJ_ENHMETADC:
384 case OBJ_ENHMETAFILE:
385 dprintf(("warning: GetObjectA not defined for object type %d", objtype));
386 return 0;
387 }
[4533]388 }
[8871]389 if(DIBSection::getSection() != NULL)
390 {
[5390]391 DIBSection *dsect = DIBSection::findObj(hObject);
[3705]392 if(dsect)
393 {
[8871]394 rc = dsect->GetDIBSection(size, lpBuffer);
395 if(rc == 0) {
396 SetLastError(ERROR_INVALID_PARAMETER);
397 return 0;
398 }
399 SetLastError(ERROR_SUCCESS);
400 return rc;
[3705]401 }
[8871]402 }
[3705]403
[8871]404 return O32_GetObject(hObject, size, lpBuffer);
[3705]405}
406//******************************************************************************
407//******************************************************************************
[4533]408int WIN32API GetObjectW( HGDIOBJ hObject, int size, void *lpBuffer)
[3705]409{
[8871]410 int ret, objtype;
[4533]411
[8871]412 objtype = GetObjectType(hObject);
[4533]413
[8871]414 switch(objtype)
415 {
416 case OBJ_FONT:
417 {
418 LOGFONTA logfonta;
[4533]419
420 if(lpBuffer == NULL) {
421 return sizeof(LOGFONTW); //return required size if buffer pointer == NULL
422 }
423 ret = GetObjectA(hObject, sizeof(logfonta), (void *)&logfonta);
424 if(ret == sizeof(logfonta))
425 {
426 LOGFONTW *logfontw = (LOGFONTW *)lpBuffer;
427
428 if(size < sizeof(LOGFONTW)) {
429 dprintf(("GDI32: GetObjectW : buffer not big enough for LOGFONTW struct!!")); //is the correct? or copy only part?
430 return 0;
431 }
432 memcpy(logfontw, &logfonta, sizeof(LOGFONTA));
433 memset(logfontw->lfFaceName, 0, LF_FACESIZE);
434 AsciiToUnicodeN(logfonta.lfFaceName, logfontw->lfFaceName, LF_FACESIZE-1);
435
436 return sizeof(LOGFONTW);
437 }
438 return 0;
[8871]439 }
440 default:
441 return GetObjectA(hObject, size, lpBuffer);
442 }
[3705]443}
444//******************************************************************************
445//******************************************************************************
[8202]446#ifdef DEBUG
[21916]447static const char *gditypenames[] = {
[8202]448"NULL",
[21524]449"OBJ_PEN",
450"OBJ_BRUSH",
451"OBJ_DC",
452"OBJ_METADC",
453"OBJ_PAL",
454"OBJ_FONT",
455"OBJ_BITMAP",
456"OBJ_REGION",
457"OBJ_METAFILE",
458"OBJ_MEMDC",
459"OBJ_EXTPEN",
460"OBJ_ENHMETADC",
[8202]461"OBJ_ENHMETAFILE"
462};
463
[21916]464const char *DbgGetGDITypeName(DWORD handleType)
[8202]465{
466 if(handleType <= OBJ_ENHMETAFILE) {
467 return gditypenames[handleType];
468 }
469 return "UNKNOWN TYPE";
470}
471#endif
472//******************************************************************************
473//******************************************************************************
[3705]474HGDIOBJ WIN32API SelectObject(HDC hdc, HGDIOBJ hObj)
475{
[8871]476 HGDIOBJ rc;
477 DWORD handleType;
[3705]478
[6163]479 //TODO: must use 16 bits gdi object handles
480 if(HIWORD(hObj) == 0) {
481 hObj |= GDIOBJ_PREFIX;
482 }
483
[8871]484 handleType = GetObjectType(hObj);
[21304]485 dprintf(("GDI32: SelectObject %x %x type %s", hdc, hObj, DbgGetGDITypeName(handleType)));
[8995]486 if(handleType == OBJ_REGION) {
[4596]487 //Return complexity here; not previously selected clip region
[4533]488 return (HGDIOBJ)SelectClipRgn(hdc, hObj);
[3705]489 }
490
[5390]491 if(handleType == OBJ_BITMAP && DIBSection::getSection() != NULL)
[3705]492 {
[4755]493 DIBSection *dsect;
[3705]494
[5390]495 dsect = DIBSection::findHDC(hdc);
[4755]496 if(dsect)
497 {
498 //remove previously selected dibsection
499 dsect->UnSelectDIBObject();
500 }
[5390]501 dsect = DIBSection::findObj(hObj);
[4755]502 if(dsect)
503 {
504 dsect->SelectDIBObject(hdc);
505 }
[3705]506 }
507 rc = O32_SelectObject(hdc, hObj);
[8871]508 if(rc != 0 && GetObjectType(rc) == OBJ_BITMAP && DIBSection::getSection != NULL)
[3705]509 {
[5390]510 DIBSection *dsect = DIBSection::findObj(rc);
[4755]511 if(dsect)
512 {
513 dsect->UnSelectDIBObject();
514 }
[3705]515 }
516 return(rc);
517}
518//******************************************************************************
[5390]519//Called from user32 ReleaseDC (for non CS_OWNDC hdcs)
[3705]520//******************************************************************************
[5390]521VOID WIN32API UnselectGDIObjects(HDC hdc)
522{
523 DIBSection *dsect;
524
525 dsect = DIBSection::findHDC(hdc);
526 if(dsect)
527 {
528 //remove previously selected dibsection
529 dsect->UnSelectDIBObject();
530 }
531}
532//******************************************************************************
533//******************************************************************************
[3705]534DWORD WIN32API GetObjectType( HGDIOBJ hObj)
535{
[8871]536 DWORD objtype = ObjQueryHandleType(hObj);
[7635]537
[8871]538 switch(objtype) {
539 case HNDL_PEN:
540 objtype = OBJ_PEN;
541 break;
542 case HNDL_BRUSH:
543 objtype = OBJ_BRUSH;
544 break;
545 case HNDL_DC:
546 objtype = OBJ_DC;
547 break;
548 case HNDL_METADC:
549 objtype = OBJ_METADC;
550 break;
551 case HNDL_PALETTE:
552 objtype = OBJ_PAL;
553 break;
554 case HNDL_FONT:
555 objtype = OBJ_FONT;
556 break;
557 case HNDL_BITMAP:
558 case HNDL_DIBSECTION:
559 objtype = OBJ_BITMAP;
560 break;
561 case HNDL_REGION:
562 objtype = OBJ_REGION;
563 break;
564 case HNDL_METAFILE:
565 objtype = OBJ_METAFILE;
566 break;
567 case HNDL_ENHMETAFILE:
568 objtype = OBJ_ENHMETAFILE;
569 break;
570 case HNDL_MEMDC:
571 objtype = OBJ_MEMDC;
572 break;
573 case HNDL_EXTPEN:
574 objtype = OBJ_EXTPEN;
575 break;
576 case HNDL_ENHMETADC:
577 objtype = OBJ_ENHMETADC;
578 break;
579 default:
580 objtype = 0;
581 break;
[6163]582 }
[8871]583 dprintf2(("GDI32: GetObjectType %x objtype %d (%s)", hObj, objtype, DbgGetGDITypeName(objtype)));
[7635]584 return objtype;
[3705]585}
586//******************************************************************************
[4857]587//TODO: System objects can't be deleted (TODO: any others?? (fonts?))!!!!)
[3705]588//******************************************************************************
[4223]589BOOL WIN32API DeleteObject(HANDLE hObj)
[3705]590{
[9252]591 DWORD objflags;
[7635]592
[9415]593//hack alert
[21524]594 if(HIWORD(hObj) == 0x100)
[9415]595 {//most likely a DC handle
596 if(OSLibGpiQueryDCData(hObj) != NULL) {
597 dprintf(("WARNING: DeleteObject used for DC handle!"));
598 return DeleteDC(hObj);
599 }
600 }
601//end hack
602
[8906]603 objflags = ObjQueryHandleFlags(hObj);
604 if(objflags & OBJHANDLE_FLAG_NODELETE) {
605 dprintf(("!WARNING!: Can't delete system object"));
606 return TRUE;
[21524]607 }
[9251]608 STATS_DeleteObject(hObj, GetObjectType(hObj));
[7635]609
[8871]610 if(ObjQueryHandleType(hObj) == HNDL_REGION)
[6558]611 {
[8871]612 OSLibDeleteRegion(ObjQueryHandleData(hObj, HNDL_REGION));
613 ObjDeleteHandle(hObj, HNDL_REGION);
[4223]614 SetLastError(ERROR_SUCCESS);
[4857]615 return TRUE;
[4755]616 }
[6558]617
[4755]618 DIBSection::deleteSection((DWORD)hObj);
619 return O32_DeleteObject(hObj);
[3705]620}
621//******************************************************************************
622//******************************************************************************
[7635]623int WIN32API EnumObjects( HDC hdc, int objType, GOBJENUMPROC objFunc, LPARAM lParam)
624{
625 //calling convention differences
626 dprintf(("!ERROR!: GDI32: EnumObjects STUB"));
627// return O32_EnumObjects(arg1, arg2, arg3, arg4);
628 return 0;
629}
630//******************************************************************************
631//******************************************************************************
632HANDLE WIN32API GetCurrentObject( HDC hdc, UINT arg2)
633{
634 return (HANDLE)O32_GetCurrentObject(hdc, arg2);
635}
636//******************************************************************************
637//******************************************************************************
[3705]638BOOL WIN32API SetObjectOwner( HGDIOBJ arg1, int arg2 )
639{
[4755]640 // Here is a guess for a undocumented entry
641 dprintf(("WARNING: GDI32: SetObjectOwner - stub (TRUE)\n"));
642 return TRUE;
[3705]643}
644//******************************************************************************
645//******************************************************************************
[7635]646BOOL WIN32API UnrealizeObject( HGDIOBJ hObject)
647{
648 return O32_UnrealizeObject(hObject);
649}
650//******************************************************************************
651//******************************************************************************
Note: See TracBrowser for help on using the repository browser.