Ignore:
Timestamp:
Dec 5, 2000, 2:04:07 PM (25 years ago)
Author:
sandervl
Message:

handle management update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gdi32/objhandle.cpp

    r4596 r4755  
    1 /* $Id: objhandle.cpp,v 1.6 2000-11-15 13:56:45 sandervl Exp $ */
     1/* $Id: objhandle.cpp,v 1.7 2000-12-05 13:04:06 sandervl Exp $ */
    22/*
    33 * Win32 Handle Management Code for OS/2
     
    3030//******************************************************************************
    3131
    32 static ULONG  objHandleTable[MAX_OBJECT_HANDLES] = {0};
    33 static ULONG  lowestFreeIndex = 0;
    34 static VMutex objTableMutex;
     32typedef struct {
     33  ULONG      dwUserData;
     34  ObjectType type;
     35} GdiObject;
     36
     37static GdiObject objHandleTable[MAX_OBJECT_HANDLES] = {0};
     38static ULONG     lowestFreeIndex = 0;
     39static VMutex    objTableMutex;
    3540
    3641//******************************************************************************
     
    3843BOOL ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, ObjectType type)
    3944{
    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!!"));
     45    objTableMutex.enter(VMUTEX_WAIT_FOREVER);
     46    if(lowestFreeIndex == -1) {
     47        //oops, out of handles
     48        objTableMutex.leave();
     49        dprintf(("ERROR: GDI: HwAllocateWindowHandle OUT OF GDI OBJECT HANDLES!!"));
     50        DebugInt3();
     51        return FALSE;
     52    }
     53    *hObject  = lowestFreeIndex;
     54    *hObject |= MAKE_HANDLE(type);
     55    objHandleTable[lowestFreeIndex].dwUserData = dwUserData;
     56    objHandleTable[lowestFreeIndex].type       = type;
     57
     58    lowestFreeIndex = -1;
     59
     60    //find next free handle
     61    for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
     62        if(objHandleTable[i].dwUserData == 0) {
     63            lowestFreeIndex = i;
     64            break;
     65        }
     66    }
    4467    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;
     68    return TRUE;
    6369}
    6470//******************************************************************************
     
    6672void ObjFreeHandle(HANDLE hObject)
    6773{
    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 //******************************************************************************
    80 DWORD 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:
     74    hObject &= OBJHANDLE_MAGIC_MASK;
     75    if(hObject < MAX_OBJECT_HANDLES) {
     76        objTableMutex.enter(VMUTEX_WAIT_FOREVER);
     77        objHandleTable[hObject].dwUserData = 0;
     78        objHandleTable[hObject].type = GDIOBJ_NONE;
     79        if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
     80            lowestFreeIndex = hObject;
     81
     82        objTableMutex.leave();
     83    }
     84}
     85//******************************************************************************
     86//******************************************************************************
     87DWORD ObjGetHandleData(HANDLE hObject, ObjectType type)
     88{
     89    hObject &= OBJHANDLE_MAGIC_MASK;
     90    if(hObject < MAX_OBJECT_HANDLES && type == objHandleTable[hObject].type) {
     91        return objHandleTable[hObject].dwUserData;
     92    }
    9193    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;
    9994}
    10095//******************************************************************************
     
    10297ObjectType ObjGetHandleType(HANDLE hObject)
    10398{
    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   }
     99    hObject &= OBJHANDLE_MAGIC_MASK;
     100    if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwUserData != 0) {
     101        return objHandleTable[hObject].type;
     102    }
     103    return GDIOBJ_NONE;
    115104}
    116105//******************************************************************************
     
    226215    if(DIBSection::getSection() != NULL)
    227216    {
    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       }
     217        DIBSection *dsect;
     218
     219        dsect = DIBSection::find(hdc);
     220        if(dsect)
     221        {
     222            //remove previously selected dibsection
     223            dsect->UnSelectDIBObject();
     224        }
     225        dsect = DIBSection::find((DWORD)hObj);
     226        if(dsect)
     227        {
     228            dsect->SelectDIBObject(hdc);
     229        }
    241230    }
    242231    rc = O32_SelectObject(hdc, hObj);
    243232    if(rc != 0 && DIBSection::getSection != NULL)
    244233    {
    245       DIBSection *dsect = DIBSection::find((DWORD)rc);
    246       if(dsect)
    247       {
    248         dsect->UnSelectDIBObject();
    249       }
     234        DIBSection *dsect = DIBSection::find((DWORD)rc);
     235        if(dsect)
     236        {
     237            dsect->UnSelectDIBObject();
     238        }
    250239    }
    251240#ifdef USING_OPEN32
    252     if(O32_GetObjectType(hObj) == OBJ_BITMAP) 
    253     {
    254         //SvL: Open32 messes up the height of the hdc (for windows)
     241    if(O32_GetObjectType(hObj) == OBJ_BITMAP)
     242    {
     243        //SvL: Open32 messes up the height of the hdc (for windows)
    255244        pDCData  pHps = (pDCData)OSLibGpiQueryDCData((HPS)hdc);
    256245        if(pHps && pHps->hwnd) {
    257               dprintf2(("change back origin"));
     246              dprintf2(("change back origin"));
    258247              selectClientArea(pHps);
    259248              setPageXForm(pHps);
     
    269258DWORD WIN32API GetObjectType( HGDIOBJ hObj)
    270259{
    271   dprintf2(("GDI32: GetObjectType\n"));
    272   if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
     260    dprintf2(("GDI32: GetObjectType\n"));
     261    if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
    273262        SetLastError(ERROR_SUCCESS);
    274     return OBJ_REGION;
    275   }
    276   return O32_GetObjectType(hObj);
     263        return OBJ_REGION;
     264    }
     265    return O32_GetObjectType(hObj);
    277266}
    278267//******************************************************************************
     
    280269BOOL WIN32API DeleteObject(HANDLE hObj)
    281270{
    282   dprintf(("GDI32: DeleteObject %x", hObj));
    283   if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
    284     OSLibDeleteRegion(ObjGetHandleData(hObj));
    285     ObjFreeHandle(hObj);
     271    dprintf(("GDI32: DeleteObject %x", hObj));
     272    if(ObjGetHandleType(hObj) == GDIOBJ_REGION) {
     273        OSLibDeleteRegion(ObjGetHandleData(hObj, GDIOBJ_REGION));
     274        ObjFreeHandle(hObj);
    286275        SetLastError(ERROR_SUCCESS);
    287     return OBJ_REGION;
    288   }
    289   DIBSection::deleteSection((DWORD)hObj);
    290   return O32_DeleteObject(hObj);
     276        return OBJ_REGION;
     277    }
     278    DIBSection::deleteSection((DWORD)hObj);
     279    return O32_DeleteObject(hObj);
    291280}
    292281//******************************************************************************
     
    294283BOOL WIN32API SetObjectOwner( HGDIOBJ arg1, int arg2 )
    295284{
    296   // Here is a guess for a undocumented entry
    297   dprintf(("WARNING: GDI32: SetObjectOwner - stub (TRUE)\n"));
    298   return TRUE;
    299 }
    300 //******************************************************************************
    301 //******************************************************************************
     285    // Here is a guess for a undocumented entry
     286    dprintf(("WARNING: GDI32: SetObjectOwner - stub (TRUE)\n"));
     287    return TRUE;
     288}
     289//******************************************************************************
     290//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.