Changeset 4533 for trunk/src/gdi32/objhandle.cpp
- Timestamp:
- Oct 26, 2000, 7:20:29 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gdi32/objhandle.cpp
r4223 r4533 1 /* $Id: objhandle.cpp,v 1. 4 2000-09-08 18:06:32sandervl Exp $ */1 /* $Id: objhandle.cpp,v 1.5 2000-10-26 17:20:29 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Handle Management Code for OS/2 … … 8 8 * 9 9 * TODO: The table should be dynamically increased when necessary 10 * This is just a quick and dirty implementation 11 * 10 * This is just a quick and dirty implementation 11 * 12 12 * Project Odin Software License can be found in LICENSE.TXT 13 13 * … … 15 15 16 16 #include <os2win.h> 17 #include <stdlib.h> 18 #include <string.h> 17 19 #include <vmutex.h> 18 20 #include <objhandle.h> … … 20 22 #include "region.h" 21 23 22 #define DBG_LOCALLOG 24 #define DBG_LOCALLOG DBG_objhandle 23 25 #include "dbglocal.h" 24 26 … … 35 37 objTableMutex.enter(VMUTEX_WAIT_FOREVER); 36 38 if(lowestFreeIndex == -1) { 37 38 39 40 41 39 //oops, out of handles 40 dprintf(("ERROR: GDI: HwAllocateWindowHandle OUT OF GDI OBJECT HANDLES!!")); 41 objTableMutex.leave(); 42 DebugInt3(); 43 return FALSE; 42 44 } 43 45 *hObject = lowestFreeIndex; … … 49 51 //find next free handle 50 52 for(int i=0;i<MAX_OBJECT_HANDLES;i++) { 51 52 53 54 53 if(objHandleTable[i] == 0) { 54 lowestFreeIndex = i; 55 break; 56 } 55 57 } 56 58 objTableMutex.leave(); … … 63 65 hObject &= OBJHANDLE_MAGIC_MASK; 64 66 if(hObject < MAX_OBJECT_HANDLES) { 65 66 67 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex) 68 69 70 67 objTableMutex.enter(VMUTEX_WAIT_FOREVER); 68 objHandleTable[hObject] = 0; 69 if(lowestFreeIndex == -1 || hObject < lowestFreeIndex) 70 lowestFreeIndex = hObject; 71 72 objTableMutex.leave(); 71 73 } 72 74 } … … 78 80 { 79 81 case GDIOBJ_REGION: 80 82 break; 81 83 //case GDIOBJ_BITMAP 82 84 //case GDIOBJ_BRUSH … … 84 86 //case GDIOBJ_FONT 85 87 default: 86 88 return HANDLE_OBJ_ERROR; 87 89 } 88 90 89 91 hObject &= OBJHANDLE_MAGIC_MASK; 90 92 if(hObject < MAX_OBJECT_HANDLES) { 91 93 return objHandleTable[hObject]; 92 94 } 93 95 return HANDLE_OBJ_ERROR; … … 100 102 { 101 103 case GDIOBJ_REGION: 102 104 return GDIOBJ_REGION; 103 105 //case GDIOBJ_BITMAP 104 106 //case GDIOBJ_BRUSH … … 106 108 //case GDIOBJ_FONT 107 109 default: 108 110 return GDIOBJ_ERROR; 109 111 } 110 112 } … … 115 117 int rc; 116 118 117 if(size == 0 || lpBuffer == NULL) { 118 SetLastError(ERROR_INVALID_PARAMETER); 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)); 119 151 return 0; 120 } 121 122 if(ObjGetHandleType(hObject) == GDIOBJ_REGION) { 123 SetLastError(ERROR_SUCCESS); 124 return 0; 125 } 126 dprintf(("GDI32: GetObject %X %X %X\n", hObject, size, lpBuffer)); 152 } 153 } 127 154 if(DIBSection::getSection() != NULL) 128 155 { … … 144 171 //****************************************************************************** 145 172 //****************************************************************************** 146 int WIN32API GetObjectW( HGDIOBJ arg1, int arg2, void * arg3) 147 { 148 dprintf(("GDI32: GetObjectW %X, %d %X not complete!", arg1, arg2, arg3)); 149 return GetObjectA(arg1, arg2, arg3); 173 int 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 } 150 209 } 151 210 //****************************************************************************** … … 158 217 159 218 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) { 160 161 219 //Return complexity here; not previously selected clip region 220 return (HGDIOBJ)SelectClipRgn(hdc, hObj); 162 221 } 163 222 … … 196 255 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) { 197 256 SetLastError(ERROR_SUCCESS); 198 257 return OBJ_REGION; 199 258 } 200 259 return O32_GetObjectType(hObj); … … 206 265 dprintf(("GDI32: DeleteObject %x", hObj)); 207 266 if(ObjGetHandleType(hObj) == GDIOBJ_REGION) { 208 209 267 OSLibDeleteRegion(ObjGetHandleData(hObj)); 268 ObjFreeHandle(hObj); 210 269 SetLastError(ERROR_SUCCESS); 211 270 return OBJ_REGION; 212 271 } 213 272 DIBSection::deleteSection((DWORD)hObj);
Note:
See TracChangeset
for help on using the changeset viewer.