- Timestamp:
- Nov 9, 2000, 7:15:23 PM (25 years ago)
- Location:
- trunk/src/user32
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/dc.cpp
r4558 r4573 1 /* $Id: dc.cpp,v 1.7 6 2000-11-05 18:49:07 sandervl Exp $ */1 /* $Id: dc.cpp,v 1.77 2000-11-09 18:15:17 sandervl Exp $ */ 2 2 3 3 /* … … 741 741 WinShowTrackRect(wnd->getOS2WindowHandle(), FALSE); 742 742 743 //testestest744 if(hwnd == 0x68000019) {745 lpps->fErase = 1;746 }747 743 if(wnd->needsEraseBkgnd() && lComplexity != RGN_NULL) { 748 744 wnd->setEraseBkgnd(FALSE); -
trunk/src/user32/dib.cpp
r2804 r4573 1 /* $Id: dib.cpp,v 1. 5 2000-02-16 14:34:16sandervl Exp $ */1 /* $Id: dib.cpp,v 1.6 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 #include <stdlib.h> 21 21 #include <misc.h> 22 #include "dib.h" 22 23 23 24 #define DBG_LOCALLOG DBG_dib … … 208 209 209 210 } 211 212 /*********************************************************************** 213 * BITMAP_GetWidthBytes 214 * 215 * Return number of bytes taken by a scanline of 16-bit aligned Windows DDB 216 * data. 217 */ 218 int BITMAP_GetWidthBytes( INT bmWidth, INT bpp ) 219 { 220 switch(bpp) 221 { 222 case 1: 223 return 2 * ((bmWidth+15) >> 4); 224 225 case 24: 226 bmWidth *= 3; /* fall through */ 227 case 8: 228 return bmWidth + (bmWidth & 1); 229 230 case 32: 231 return bmWidth * 4; 232 233 case 16: 234 case 15: 235 return bmWidth * 2; 236 237 case 4: 238 return 2 * ((bmWidth+3) >> 2); 239 240 default: 241 dprintf(("BITMAP_GetWidthBytes: Unknown depth %d, please report.\n", bpp )); 242 } 243 return -1; 244 } -
trunk/src/user32/dib.h
r2469 r4573 1 /* $Id: dib.h,v 1. 3 2000-01-18 20:08:09sandervl Exp $ */1 /* $Id: dib.h,v 1.4 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 3 3 /* … … 25 25 int *height, WORD *bpp, WORD *compr ); 26 26 void DIB_FixColorsToLoadflags(BITMAPINFO * bmi, UINT loadflags, BYTE pix); 27 int BITMAP_GetWidthBytes( INT width, INT depth ); 27 28 28 29 #endif -
trunk/src/user32/loadres.cpp
r4558 r4573 1 /* $Id: loadres.cpp,v 1.3 2 2000-11-05 18:49:07sandervl Exp $ */1 /* $Id: loadres.cpp,v 1.33 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 3 3 /* … … 107 107 //****************************************************************************** 108 108 //****************************************************************************** 109 HICON LoadIconA(HINSTANCE hinst, LPCSTR lpszIcon, DWORD cxDesired, 110 DWORD cyDesired, DWORD fuLoad) 111 { 112 HICON hIcon; 113 HANDLE hMapping = 0; 114 char *ptr = NULL; 115 HRSRC hRes; 116 LPSTR restype = RT_ICONA; 117 118 dprintf(("USER32: LoadIconA %x %x (%d,%d) %x", hinst, lpszIcon, cxDesired, cyDesired, fuLoad)); 119 120 if(fuLoad & LR_LOADFROMFILE) 121 { 122 hMapping = VIRTUAL_MapFileA( lpszIcon, (LPVOID *)&ptr, TRUE); 123 if(hMapping == INVALID_HANDLE_VALUE) 124 return 0; 125 hIcon = OSLibWinCreatePointer(ptr); 126 CloseHandle(hMapping); 109 HICON WIN32API LoadIconA(HINSTANCE hinst, LPCSTR lpszIcon) 110 { 111 if(HIWORD(lpszIcon)) { 112 dprintf(("LoadIconA %x %s", hinst, lpszIcon)); 113 } 114 else dprintf(("LoadIconA %x %x", hinst, lpszIcon)); 115 return LoadImageA(hinst, lpszIcon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); 116 } 117 //****************************************************************************** 118 //****************************************************************************** 119 HICON WIN32API LoadIconW(HINSTANCE hinst, LPCWSTR lpszIcon) 120 { 121 dprintf(("LoadIconA %x %x", hinst, lpszIcon)); 122 return LoadImageW(hinst, lpszIcon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); 123 } 124 //****************************************************************************** 125 //****************************************************************************** 126 HCURSOR LoadCursorW(HINSTANCE hinst, LPCWSTR lpszCursor, DWORD cxDesired, 127 DWORD cyDesired, DWORD fuLoad) 128 { 129 HCURSOR hCursor; 130 HANDLE hMapping = 0; 131 char *ptr = NULL; 132 HRSRC hRes; 133 LPSTR restype = RT_CURSORA; 134 LPVOID lpOS2Resdata = NULL; 135 136 if(fuLoad & LR_LOADFROMFILE) 137 { 138 hMapping = VIRTUAL_MapFileW( lpszCursor, (LPVOID *)&ptr, TRUE); 139 if(hMapping == INVALID_HANDLE_VALUE) 140 return 0; 141 142 lpOS2Resdata = ConvertCursorToOS2(ptr); 143 hCursor = OSLibWinCreatePointer(lpOS2Resdata, cxDesired, cyDesired); 144 FreeOS2Resource(lpOS2Resdata); 145 146 UnmapViewOfFile(ptr); 147 CloseHandle(hMapping); 127 148 } 128 149 else 129 150 { 130 if(!hinst) 131 { 132 hRes = FindResourceA(hInstanceUser32,lpszIcon,RT_ICONA); 133 if(!hRes) { 134 hRes = FindResourceA(hInstanceUser32,lpszIcon,RT_GROUP_ICONA); 135 restype = RT_GROUP_ICONA; 136 } 137 if(hRes) 138 { 139 hIcon = OSLibWinCreateIcon(ConvertResourceToOS2(hInstanceUser32, restype, hRes)); 140 } 141 else hIcon = OSLibWinQuerySysIcon((ULONG)lpszIcon,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON)); 142 } 143 else 144 { //not a system icon 145 hRes = FindResourceA(hinst,lpszIcon,RT_ICONA); 146 if(!hRes) { 147 hRes = FindResourceA(hinst,lpszIcon,RT_GROUP_ICONA); 148 restype = RT_GROUP_ICONA; 149 } 150 if(hRes) { 151 hIcon = OSLibWinCreateIcon(ConvertResourceToOS2(hinst, restype, hRes)); 152 } 153 else hIcon = 0; 154 } 155 } 156 dprintf(("LoadIconA (%X) returned %x\n", hinst, hIcon)); 157 158 return(hIcon); 159 } 160 //****************************************************************************** 161 //****************************************************************************** 162 HICON LoadIconW(HINSTANCE hinst, LPCWSTR lpszIcon, DWORD cxDesired, 163 DWORD cyDesired, DWORD fuLoad) 164 { 165 HICON hIcon; 166 HANDLE hMapping = 0; 167 char *ptr = NULL; 168 HRSRC hRes; 169 LPSTR restype = RT_ICONA; 170 171 if(fuLoad & LR_LOADFROMFILE) 172 { 173 hMapping = VIRTUAL_MapFileW( lpszIcon, (LPVOID *)&ptr, TRUE); 174 if(hMapping == INVALID_HANDLE_VALUE) 175 return 0; 176 hIcon = OSLibWinCreatePointer(ptr); 177 CloseHandle(hMapping); 178 } 179 else 180 { 181 if (!hinst) 182 { 183 hRes = FindResourceW(hInstanceUser32,lpszIcon,RT_ICONW); 184 if(!hRes) { 185 hRes = FindResourceW(hInstanceUser32,lpszIcon,RT_GROUP_ICONW); 186 restype = RT_GROUP_ICONA; 187 } 188 if(hRes) 189 { 190 hIcon = OSLibWinCreateIcon(ConvertResourceToOS2(hInstanceUser32, restype, hRes)); 191 } 192 else hIcon = OSLibWinQuerySysIcon((ULONG)lpszIcon,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON)); 193 } 194 else 195 {//not a system icon 196 hRes = FindResourceW(hinst,lpszIcon,RT_ICONW); 197 if(!hRes) { 198 hRes = FindResourceW(hinst,lpszIcon,RT_GROUP_ICONW); 199 restype = RT_GROUP_ICONA; 200 } 201 if(hRes) { 202 hIcon = OSLibWinCreateIcon(ConvertResourceToOS2(hinst, restype, hRes)); 203 } 204 else hIcon = 0; 205 } 206 } 207 dprintf(("LoadIconW (%X) returned %x\n", hinst, hIcon)); 208 209 return(hIcon); 210 } 211 //****************************************************************************** 212 //****************************************************************************** 213 HICON WIN32API LoadIconA(HINSTANCE hinst, LPCSTR lpszIcon) 214 { 215 return LoadIconA(hinst, lpszIcon, 0, 0, 0); 216 } 217 //****************************************************************************** 218 //****************************************************************************** 219 HICON WIN32API LoadIconW(HINSTANCE hinst, LPCWSTR lpszIcon) 220 { 221 return LoadIconW(hinst, lpszIcon, 0, 0, 0); 222 } 223 //****************************************************************************** 224 //****************************************************************************** 225 HCURSOR LoadCursorA(HINSTANCE hinst, LPCSTR lpszCursor, DWORD cxDesired, 226 DWORD cyDesired, DWORD fuLoad) 227 { 228 HCURSOR hCursor; 229 HANDLE hMapping = 0; 230 char *ptr = NULL; 231 HRSRC hRes; 232 LPSTR restype = RT_CURSORA; 233 234 if(fuLoad & LR_LOADFROMFILE) 235 { 236 hMapping = VIRTUAL_MapFileA( lpszCursor, (LPVOID *)&ptr, TRUE); 237 if(hMapping == INVALID_HANDLE_VALUE) 238 return 0; 239 hCursor = OSLibWinCreatePointer(ptr); 240 CloseHandle(hMapping); 241 } 242 else 243 { 244 if(!hinst) 245 { 246 hRes = FindResourceA(hInstanceUser32,lpszCursor,RT_CURSORA); 247 if(!hRes) { 248 hRes = FindResourceA(hInstanceUser32,lpszCursor,RT_GROUP_CURSORA); 249 restype = RT_GROUP_CURSORA; 250 } 251 if(hRes) 252 { 253 hCursor = OSLibWinCreatePointer(ConvertResourceToOS2(hInstanceUser32, restype, hRes)); 254 } 255 else hCursor = OSLibWinQuerySysPointer((ULONG)lpszCursor,GetSystemMetrics(SM_CXCURSOR),GetSystemMetrics(SM_CYCURSOR)); 256 } 257 else 258 { //not a system icon 259 hRes = FindResourceA(hinst,lpszCursor,RT_CURSORA); 260 if(!hRes) { 261 hRes = FindResourceA(hinst,lpszCursor,RT_GROUP_CURSORA); 262 restype = RT_GROUP_CURSORA; 263 } 264 if(hRes) { 265 hCursor = OSLibWinCreatePointer(ConvertResourceToOS2(hinst, restype, hRes)); 266 } 267 else hCursor = 0; 268 } 269 } 270 if(HIWORD(lpszCursor)) { 271 dprintf(("LoadCursorA %s from %x returned %x\n", lpszCursor, hinst, hCursor)); 272 } 273 else dprintf(("LoadCursorA %x from %x returned %x\n", lpszCursor, hinst, hCursor)); 151 if(!hinst) 152 { 153 hRes = FindResourceW(hInstanceUser32,lpszCursor,RT_CURSORW); 154 if(!hRes) { 155 hRes = FindResourceW(hInstanceUser32,lpszCursor,RT_GROUP_CURSORW); 156 restype = RT_GROUP_CURSORA; 157 } 158 if(hRes) 159 { 160 lpOS2Resdata = ConvertResourceToOS2(hInstanceUser32, restype, hRes); 161 hCursor = OSLibWinCreatePointer(lpOS2Resdata, cxDesired, cyDesired); 162 FreeOS2Resource(lpOS2Resdata); 163 } 164 else hCursor = OSLibWinQuerySysPointer((ULONG)lpszCursor, cxDesired, cyDesired); 165 } 166 else 167 { //not a system icon 168 hRes = FindResourceW(hinst,lpszCursor,RT_CURSORW); 169 if(!hRes) { 170 hRes = FindResourceW(hinst,lpszCursor,RT_GROUP_CURSORW); 171 restype = RT_GROUP_CURSORA; 172 } 173 if(hRes) { 174 lpOS2Resdata = ConvertResourceToOS2(hinst, restype, hRes); 175 hCursor = OSLibWinCreatePointer(lpOS2Resdata, cxDesired, cyDesired); 176 FreeOS2Resource(lpOS2Resdata); 177 } 178 else hCursor = 0; 179 } 180 } 181 dprintf(("LoadCursorA %x from %x returned %x\n", lpszCursor, hinst, hCursor)); 274 182 275 183 return(hCursor); … … 277 185 //****************************************************************************** 278 186 //****************************************************************************** 279 HCURSOR LoadCursorW(HINSTANCE hinst, LPCWSTR lpszCursor, DWORD cxDesired,280 DWORD cyDesired, DWORD fuLoad)281 {282 HCURSOR hCursor;283 HANDLE hMapping = 0;284 char *ptr = NULL;285 HRSRC hRes;286 LPSTR restype = RT_CURSORA;287 288 if(fuLoad & LR_LOADFROMFILE)289 {290 hMapping = VIRTUAL_MapFileW( lpszCursor, (LPVOID *)&ptr, TRUE);291 if(hMapping == INVALID_HANDLE_VALUE)292 return 0;293 hCursor = OSLibWinCreatePointer(ptr);294 CloseHandle(hMapping);295 }296 else297 {298 if(!hinst)299 {300 hRes = FindResourceW(hInstanceUser32,lpszCursor,RT_CURSORW);301 if(!hRes) {302 hRes = FindResourceW(hInstanceUser32,lpszCursor,RT_GROUP_CURSORW);303 restype = RT_GROUP_CURSORA;304 }305 if(hRes)306 {307 hCursor = OSLibWinCreatePointer(ConvertResourceToOS2(hInstanceUser32, restype, hRes));308 }309 else hCursor = OSLibWinQuerySysPointer((ULONG)lpszCursor,GetSystemMetrics(SM_CXCURSOR),GetSystemMetrics(SM_CYCURSOR));310 }311 else312 { //not a system icon313 hRes = FindResourceW(hinst,lpszCursor,RT_CURSORW);314 if(!hRes) {315 hRes = FindResourceW(hinst,lpszCursor,RT_GROUP_CURSORW);316 restype = RT_GROUP_CURSORA;317 }318 if(hRes) {319 hCursor = OSLibWinCreatePointer(ConvertResourceToOS2(hinst, restype, hRes));320 }321 else hCursor = 0;322 }323 }324 dprintf(("LoadCursorW (%X) returned %x\n", hinst, hCursor));325 326 return(hCursor);327 }328 //******************************************************************************329 //******************************************************************************330 187 HCURSOR WIN32API LoadCursorA(HINSTANCE hinst, LPCSTR lpszCursor) 331 188 { 332 return LoadCursorA(hinst, lpszCursor, 0, 0, 0); 189 return LoadImageA(hinst, lpszCursor, IMAGE_CURSOR, 0, 0, 190 LR_SHARED | LR_DEFAULTSIZE ); 333 191 } 334 192 //****************************************************************************** … … 336 194 HCURSOR WIN32API LoadCursorW(HINSTANCE hinst, LPCWSTR lpszCursor) 337 195 { 338 return LoadCursorW(hinst, lpszCursor, 0, 0, 0); 339 } 340 //****************************************************************************** 341 //****************************************************************************** 342 BOOL IsSystemBitmap(ULONG id) 343 { 344 switch(id) 345 { 346 case OBM_UPARROW: 347 case OBM_DNARROW: 348 case OBM_RGARROW: 349 case OBM_LFARROW: 350 case OBM_RESTORE: 351 case OBM_RESTORED: 352 case OBM_UPARROWD: 353 case OBM_DNARROWD: 354 case OBM_RGARROWD: 355 case OBM_LFARROWD: 356 case OBM_OLD_UPARROW: 357 case OBM_OLD_DNARROW: 358 case OBM_OLD_RGARROW: 359 case OBM_OLD_LFARROW: 360 case OBM_CHECK: 361 case OBM_RADIOCHECK: 362 case OBM_CHECKBOXES: 363 case OBM_BTNCORNERS: 364 case OBM_COMBO: 365 case OBM_REDUCE: 366 case OBM_REDUCED: 367 case OBM_ZOOM: 368 case OBM_ZOOMD: 369 case OBM_SIZE: 370 case OBM_CLOSE: 371 case OBM_MNARROW: 372 case OBM_UPARROWI: 373 case OBM_DNARROWI: 374 case OBM_RGARROWI: 375 case OBM_LFARROWI: 376 case OBM_CLOSED: 377 case OBM_OLD_CLOSE: 378 case OBM_BTSIZE: 379 case OBM_OLD_REDUCE: 380 case OBM_OLD_ZOOM: 381 case OBM_OLD_RESTORE: 382 case OBM_CONTEXTHELP: 383 case OBM_CONTEXTHELPD: 384 case OBM_TRTYPE: 385 return TRUE; 386 387 default: 388 return FALSE; 389 } 390 } 391 //****************************************************************************** 392 //NOTE: LR_CREATEDIBSECTION flag doesn't work (crash in GDI32)! 393 //****************************************************************************** 394 HANDLE LoadBitmapA(HINSTANCE hinst, LPCSTR lpszName, int cxDesired, int cyDesired, 196 return LoadImageW(hinst, lpszCursor, IMAGE_CURSOR, 0, 0, 197 LR_SHARED | LR_DEFAULTSIZE ); 198 } 199 /*********************************************************************** 200 * LoadCursorFromFileW (USER32.361) 201 */ 202 HCURSOR WIN32API LoadCursorFromFileW (LPCWSTR name) 203 { 204 return LoadImageW(0, name, IMAGE_CURSOR, 0, 0, 205 LR_LOADFROMFILE | LR_DEFAULTSIZE ); 206 } 207 /*********************************************************************** 208 * LoadCursorFromFileA (USER32.360) 209 */ 210 HCURSOR WIN32API LoadCursorFromFileA (LPCSTR name) 211 { 212 return LoadImageA(0, name, IMAGE_CURSOR, 0, 0, 213 LR_LOADFROMFILE | LR_DEFAULTSIZE ); 214 } 215 //****************************************************************************** 216 //NOTE: LR_CREATEDIBSECTION flag doesn't work (crash in GDI32)! (still??) 217 //****************************************************************************** 218 HANDLE LoadBitmapW(HINSTANCE hinst, LPCWSTR lpszName, int cxDesired, int cyDesired, 395 219 UINT fuLoad) 396 220 { … … 404 228 int size; 405 229 406 if (!(fuLoad & LR_LOADFROMFILE)) { 407 if (!(hRsrc = FindResourceA( hinst, lpszName, RT_BITMAPA ))) return 0; 408 if (!(handle = LoadResource( hinst, hRsrc ))) return 0; 409 410 if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0; 230 if (!(fuLoad & LR_LOADFROMFILE)) 231 { 232 handle = 0; 233 if(!hinst) 234 { 235 hRsrc = FindResourceW( hInstanceUser32, lpszName, RT_BITMAPW ); 236 if(hRsrc) { 237 handle = LoadResource( hInstanceUser32, hRsrc ); 238 } 239 } 240 if(handle == 0) 241 { 242 if (!(hRsrc = FindResourceW( hinst, lpszName, RT_BITMAPW ))) return 0; 243 if (!(handle = LoadResource( hinst, hRsrc ))) return 0; 244 } 245 246 if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0; 411 247 } 412 248 else 413 249 { 414 hMapping = VIRTUAL_MapFile A( lpszName, (LPVOID *)&ptr, TRUE);250 hMapping = VIRTUAL_MapFileW( lpszName, (LPVOID *)&ptr, TRUE); 415 251 if (hMapping == INVALID_HANDLE_VALUE) { 416 417 dprintf(("LoadBitmapA: failed to load file %s(lasterr=%x)", lpszName, GetLastError()));418 419 252 //TODO: last err set to ERROR_OPEN_FAILED if file not found; correct?? 253 dprintf(("LoadBitmapW: failed to load file %x (lasterr=%x)", lpszName, GetLastError())); 254 return 0; 255 } 420 256 info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER)); 421 257 } … … 482 318 hbitmap = CreateDIBitmap(hdc, &fix_info->bmiHeader, CBM_INIT, 483 319 bits, fix_info, DIB_RGB_COLORS ); 484 485 dprintf(("LoadBitmapA: CreateDIBitmap failed!!"));486 320 if(hbitmap == 0) { 321 dprintf(("LoadBitmapW: CreateDIBitmap failed!!")); 322 } 487 323 // } 488 324 } … … 492 328 GlobalFree(hFix); 493 329 } 494 if (fuLoad & LR_LOADFROMFILE) CloseHandle( hMapping ); 330 if(fuLoad & LR_LOADFROMFILE) { 331 UnmapViewOfFile(ptr); 332 CloseHandle(hMapping); 333 } 495 334 return hbitmap; 496 335 } 497 336 //****************************************************************************** 337 //TODO: scale bitmap 338 //****************************************************************************** 339 HANDLE CopyBitmap(HANDLE hBitmap, DWORD desiredx, DWORD desiredy) 340 { 341 HBITMAP res = 0; 342 BITMAP bm; 343 344 if(GetObjectA(hBitmap, sizeof(BITMAP), &bm) == FALSE) { 345 dprintf(("CopyBitmap: GetObject failed!!")); 346 return 0; 347 } 348 349 bm.bmBits = NULL; 350 res = CreateBitmapIndirect(&bm); 351 352 if(res) 353 { 354 char *buf = (char *)HeapAlloc( GetProcessHeap(), 0, bm.bmWidthBytes * 355 bm.bmHeight ); 356 GetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); 357 SetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); 358 HeapFree( GetProcessHeap(), 0, buf ); 359 } 360 return res; 361 } 362 //****************************************************************************** 498 363 //TODO: No support for RT_NEWBITMAP 499 364 //****************************************************************************** … … 502 367 HBITMAP hBitmap = 0; 503 368 504 if (!hinst) 505 { 506 if(IsSystemBitmap((ULONG)lpszBitmap)) 507 { 508 hBitmap = LoadBitmapA(hInstanceUser32, lpszBitmap, 0, 0, 0); 509 } 510 } 511 if(!hBitmap) 512 hBitmap = LoadBitmapA(hinst, lpszBitmap, 0, 0, 0); 369 hBitmap = LoadImageA(hinst, lpszBitmap, IMAGE_BITMAP, 0, 0, 0); 513 370 514 371 if(HIWORD(lpszBitmap)) { 515 372 dprintf(("LoadBitmapA %x %s returned %08xh\n", hinst, lpszBitmap, hBitmap)); 516 373 } 517 374 else dprintf(("LoadBitmapA %x %x returned %08xh\n", hinst, lpszBitmap, hBitmap)); … … 526 383 HBITMAP hBitmap = 0; 527 384 528 if(HIWORD(lpszBitmap) != 0) 529 lpszBitmap = (LPWSTR)UnicodeToAsciiString((LPWSTR)lpszBitmap); 530 531 hBitmap = LoadBitmapA((hinst == 0) ? hInstanceUser32:hinst, (LPSTR)lpszBitmap, 0, 0, 0); 532 533 if(HIWORD(lpszBitmap) != 0) 534 FreeAsciiString((LPSTR)lpszBitmap); 385 hBitmap = LoadBitmapW((hinst == 0) ? hInstanceUser32:hinst, lpszBitmap, 0, 0, 0); 535 386 536 387 if(HIWORD(lpszBitmap)) { 537 388 dprintf(("LoadBitmapW %x %s returned %08xh\n", hinst, lpszBitmap, hBitmap)); 538 389 } 539 390 else dprintf(("LoadBitmapW %x %x returned %08xh\n", hinst, lpszBitmap, hBitmap)); … … 542 393 } 543 394 //****************************************************************************** 544 //TODO: Far from complete, but works for loading resources from exe545 //fuLoad flag ignored546 395 //****************************************************************************** 547 396 HANDLE WIN32API LoadImageA(HINSTANCE hinst, LPCSTR lpszName, UINT uType, 548 397 int cxDesired, int cyDesired, UINT fuLoad) 549 398 { 399 HANDLE res = 0; 400 LPCWSTR u_name; 401 402 if(HIWORD(lpszName)) { 403 dprintf(("LoadImageA %x %s %d (%d,%d)\n", hinst, lpszName, uType, cxDesired, cyDesired)); 404 } 405 else dprintf(("LoadImageA %x %x %d (%d,%d)\n", hinst, lpszName, uType, cxDesired, cyDesired)); 406 407 if (HIWORD(lpszName)) { 408 u_name = HEAP_strdupAtoW(GetProcessHeap(), 0, lpszName); 409 } 410 else u_name=(LPWSTR)lpszName; 411 412 res = LoadImageW(hinst, u_name, uType, cxDesired, cyDesired, fuLoad); 413 414 if (HIWORD(lpszName)) 415 HeapFree(GetProcessHeap(), 0, (LPVOID)u_name); 416 417 return res; 418 } 419 //****************************************************************************** 420 //****************************************************************************** 421 HANDLE WIN32API LoadImageW(HINSTANCE hinst, LPCWSTR lpszName, UINT uType, 422 int cxDesired, int cyDesired, UINT fuLoad) 423 { 550 424 HANDLE hRet = 0; 551 425 552 if(HIWORD(lpszName)) { 553 dprintf(("LoadImageA NOT COMPLETE %x %s %d (%d,%d)\n", hinst, lpszName, uType, cxDesired, cyDesired)); 554 } 555 else dprintf(("LoadImageA NOT COMPLETE %x %x %d (%d,%d)\n", hinst, lpszName, uType, cxDesired, cyDesired)); 556 557 if(fuLoad & LR_DEFAULTSIZE) { 558 if (uType == IMAGE_ICON) { 559 if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXICON); 560 if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYICON); 561 } 562 else if (uType == IMAGE_CURSOR) { 563 if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXCURSOR); 564 if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYCURSOR); 565 } 566 } 567 if (fuLoad & LR_LOADFROMFILE) fuLoad &= ~LR_SHARED; 568 569 switch(uType) { 570 case IMAGE_BITMAP: 571 hRet = (HANDLE)LoadBitmapA(hinst, lpszName, cxDesired, cyDesired, fuLoad); 572 break; 573 case IMAGE_CURSOR: 574 hRet = (HANDLE)LoadCursorA(hinst, lpszName, cxDesired, cyDesired, fuLoad); 575 break; 576 case IMAGE_ICON: 577 hRet = (HANDLE)LoadIconA(hinst, lpszName, cxDesired, cyDesired, fuLoad); 578 break; 579 default: 580 dprintf(("LoadImageA: unsupported type %d!!", uType)); 581 return 0; 582 } 583 dprintf(("LoadImageA returned %x\n", (int)hRet)); 584 585 return(hRet); 586 } 587 //****************************************************************************** 588 //****************************************************************************** 589 HANDLE WIN32API LoadImageW(HINSTANCE hinst, LPCWSTR lpszName, UINT uType, 590 int cxDesired, int cyDesired, UINT fuLoad) 591 { 592 HANDLE hRet = 0; 593 594 dprintf(("LoadImageW NOT COMPLETE (%d,%d)\n", cxDesired, cyDesired)); 426 dprintf(("LoadImageW %x %x %d (%d,%d)\n", hinst, lpszName, uType, cxDesired, cyDesired)); 595 427 596 428 if (fuLoad & LR_DEFAULTSIZE) { … … 606 438 if (fuLoad & LR_LOADFROMFILE) fuLoad &= ~LR_SHARED; 607 439 608 switch(uType) { 440 switch (uType) 441 { 609 442 case IMAGE_BITMAP: 610 hRet = (HANDLE)LoadBitmapW(hinst, lpszName); 611 break; 443 { 444 hRet = (HANDLE)LoadBitmapW(hinst, lpszName, cxDesired, cyDesired, fuLoad); 445 break; 446 } 447 case IMAGE_ICON: 448 { 449 HDC hdc = GetDC(0); 450 UINT palEnts = GetSystemPaletteEntries(hdc, 0, 0, NULL); 451 if (palEnts == 0) 452 palEnts = 256; 453 ReleaseDC(0, hdc); 454 455 hRet = CURSORICON_Load(hinst, lpszName, cxDesired, cyDesired, palEnts, FALSE, fuLoad); 456 break; 457 } 458 612 459 case IMAGE_CURSOR: 613 hRet = (HANDLE)LoadCursorW(hinst, lpszName, cxDesired, cyDesired, fuLoad); 614 break; 615 case IMAGE_ICON: 616 hRet = (HANDLE)LoadIconW(hinst, lpszName, cxDesired, cyDesired, fuLoad); 617 break; 460 hRet = (HANDLE)LoadCursorW(hinst, lpszName, cxDesired, cyDesired, fuLoad); 461 break; 462 // return CURSORICON_Load(hinst, name, desiredx, desiredy, 1, TRUE, loadflags); 463 618 464 default: 619 465 dprintf(("LoadImageW: unsupported type %d!!", uType)); … … 642 488 * 643 489 */ 644 HICON WINAPI CopyImage( 645 490 HICON WINAPI CopyImage(HANDLE hnd, UINT type, INT desiredx, 491 INT desiredy, UINT flags ) 646 492 { 647 493 dprintf(("CopyImage %x %d (%d,%d) %x", hnd, type, desiredx, desiredy, flags)); 648 494 switch (type) 649 495 { 650 //case IMAGE_BITMAP:651 // return BITMAP_CopyBitmap(hnd);496 case IMAGE_BITMAP: 497 return CopyBitmap(hnd, desiredx, desiredy); 652 498 case IMAGE_ICON: 653 return CopyIcon(hnd);499 return (HANDLE)CURSORICON_ExtCopy(hnd, type, desiredx, desiredy, flags); 654 500 case IMAGE_CURSOR: 655 return CopyCursor(hnd); 501 /* Should call CURSORICON_ExtCopy but more testing 502 * needs to be done before we change this 503 */ 504 return O32_CopyCursor(hnd); 656 505 // return CopyCursorIcon(hnd,type, desiredx, desiredy, flags); 657 506 default: -
trunk/src/user32/oslibres.cpp
r3101 r4573 1 /* $Id: oslibres.cpp,v 1.1 0 2000-03-13 13:10:47sandervl Exp $ */1 /* $Id: oslibres.cpp,v 1.11 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 /* 3 3 * Window API wrappers for OS/2 … … 24 24 #include "pmwindow.h" 25 25 26 #define DBG_LOCALLOG 26 #define DBG_LOCALLOG DBG_oslibres 27 27 #include "dbglocal.h" 28 28 … … 46 46 } 47 47 //****************************************************************************** 48 //****************************************************************************** 49 HANDLE OSLibWinCreateIcon(PVOID iconbitmap) 48 //TODO: change search method for icon array (cxDesired, cyDesired) 49 //TODO: PM rescales the icon internally!!! ($W(#*&$(*%&) 50 //****************************************************************************** 51 HANDLE OSLibWinCreateIcon(PVOID iconbitmap, ULONG cxDesired, ULONG cyDesired) 50 52 { 51 53 POINTERINFO pointerInfo = {0}; … … 102 104 hps = WinGetScreenPS(HWND_DESKTOP); 103 105 104 hbmColor = GpiCreateBitmap(hps, &bfhColor->bmp2, CBM_INIT, 105 (char *)bafh + bfhColor->offBits, 106 (BITMAPINFO2 *)&bfhColor->bmp2); 106 //Resize icon bitmap if requested size is different 107 if(cxDesired != bfhColor->bmp2.cx|| cyDesired != bfhColor->bmp2.cy) 108 { 109 BITMAPINFOHEADER2 infohdr = bfhColor->bmp2; 110 111 infohdr.cx = cxDesired; 112 infohdr.cy = cyDesired; 113 hbmColor = GpiCreateBitmap(hps, &infohdr, CBM_INIT, 114 (char *)bafh + bfhColor->offBits, 115 (BITMAPINFO2 *)&bfhColor->bmp2); 116 } 117 else { 118 hbmColor = GpiCreateBitmap(hps, &bfhColor->bmp2, CBM_INIT, 119 (char *)bafh + bfhColor->offBits, 120 (BITMAPINFO2 *)&bfhColor->bmp2); 121 } 107 122 if(hbmColor == GPI_ERROR) { 108 123 dprintf(("OSLibWinCreateIcon: GpiCreateBitmap failed!")); … … 110 125 return 0; 111 126 } 112 hbmMask = GpiCreateBitmap(hps, &bfhBW->bmp2, CBM_INIT, 113 (char *)bafh + bfhBW->offBits, 114 (BITMAPINFO2 *)&bfhBW->bmp2); 127 //Resize icon mask if requested size is different 128 if(cxDesired != bfhBW->bmp2.cx|| cyDesired*2 != bfhBW->bmp2.cy) 129 { 130 BITMAPINFOHEADER2 infohdr = bfhBW->bmp2; 131 132 infohdr.cx = cxDesired; 133 infohdr.cy = cyDesired; 134 hbmMask = GpiCreateBitmap(hps, &infohdr, CBM_INIT, 135 (char *)bafh + bfhBW->offBits, 136 (BITMAPINFO2 *)&bfhBW->bmp2); 137 } 138 else { 139 hbmMask = GpiCreateBitmap(hps, &bfhBW->bmp2, CBM_INIT, 140 (char *)bafh + bfhBW->offBits, 141 (BITMAPINFO2 *)&bfhBW->bmp2); 142 } 115 143 if(hbmMask == GPI_ERROR) { 116 144 dprintf(("OSLibWinCreateIcon: GpiCreateBitmap hbmMask failed!")); … … 132 160 GpiDeleteBitmap(hbmColor); 133 161 WinReleasePS(hps); 162 134 163 return hIcon; 135 164 } 136 165 //****************************************************************************** 137 //****************************************************************************** 138 HANDLE OSLibWinCreatePointer(PVOID cursorbitmap) 166 //TODO: change cursor size if required!! (cxDesired, cyDesired) 167 //****************************************************************************** 168 HANDLE OSLibWinCreatePointer(PVOID cursorbitmap, ULONG cxDesired, ULONG cyDesired) 139 169 { 140 170 POINTERINFO pointerInfo = {0}; -
trunk/src/user32/oslibres.h
r2469 r4573 1 /* $Id: oslibres.h,v 1. 4 2000-01-18 20:08:12sandervl Exp $ */1 /* $Id: oslibres.h,v 1.5 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 /* 3 3 * Window GUI resource wrapper functions for OS/2 … … 18 18 19 19 HANDLE OSLibWinSetAccelTable(HWND hwnd, HANDLE hAccel, PVOID acceltemplate); 20 HANDLE OSLibWinCreateIcon(PVOID iconbitmap );21 HANDLE OSLibWinCreatePointer(PVOID cursorbitmap );20 HANDLE OSLibWinCreateIcon(PVOID iconbitmap, ULONG cxDesired, ULONG cyDesired); 21 HANDLE OSLibWinCreatePointer(PVOID cursorbitmap, ULONG cxDesired, ULONG cyDesired); 22 22 HANDLE OSLibWinQuerySysPointer(ULONG type,INT w,INT h); 23 23 HANDLE OSLibWinQuerySysIcon(ULONG type,INT w,INT h); -
trunk/src/user32/user32.cpp
r4554 r4573 1 /* $Id: user32.cpp,v 1.8 6 2000-11-05 13:39:50sandervl Exp $ */1 /* $Id: user32.cpp,v 1.87 2000-11-09 18:15:18 sandervl Exp $ */ 2 2 3 3 /* … … 368 368 } else return FALSE; 369 369 } 370 /*****************************************************************************371 * Name : HCURSOR WIN32API LoadCursorFromFileA372 * Purpose : The LoadCursorFromFile function creates a cursor based on data373 * contained in a file. The file is specified by its name or by a374 * system cursor identifier. The function returns a handle to the375 * newly created cursor. Files containing cursor data may be in376 * either cursor (.CUR) or animated cursor (.ANI) format.377 * Parameters: LPCTSTR lpFileName pointer to cursor file, or system cursor id378 * Variables :379 * Result : If the function is successful, the return value is a handle to380 * the new cursor.381 * If the function fails, the return value is NULL. To get extended382 * error information, call GetLastError. GetLastError may return383 * the following384 * Remark :385 * Status : UNTESTED STUB386 *387 * Author : Patrick Haller [Thu, 1998/02/26 11:55]388 *****************************************************************************/389 HCURSOR WIN32API LoadCursorFromFileA(LPCTSTR lpFileName)390 {391 if (!HIWORD(lpFileName))392 {393 return LoadCursorA(NULL,lpFileName);394 }395 else396 {397 dprintf(("USER32:LoadCursorFromFileA (%s) not implemented.\n",398 lpFileName));399 400 return (NULL);401 }402 }403 /*****************************************************************************404 * Name : HCURSOR WIN32API LoadCursorFromFileW405 * Purpose : The LoadCursorFromFile function creates a cursor based on data406 * contained in a file. The file is specified by its name or by a407 * system cursor identifier. The function returns a handle to the408 * newly created cursor. Files containing cursor data may be in409 * either cursor (.CUR) or animated cursor (.ANI) format.410 * Parameters: LPCTSTR lpFileName pointer to cursor file, or system cursor id411 * Variables :412 * Result : If the function is successful, the return value is a handle to413 * the new cursor.414 * If the function fails, the return value is NULL. To get extended415 * error information, call GetLastError. GetLastError may return416 * the following417 * Remark :418 * Status : UNTESTED STUB419 *420 * Author : Patrick Haller [Thu, 1998/02/26 11:55]421 *****************************************************************************/422 HCURSOR WIN32API LoadCursorFromFileW(LPCWSTR lpFileName)423 {424 if (!HIWORD(lpFileName))425 {426 return LoadCursorW(NULL,lpFileName);427 } else428 {429 dprintf(("USER32:LoadCursorFromFileW (%s) not implemented.\n",430 lpFileName));431 432 return (NULL);433 }434 }435 370 //****************************************************************************** 436 371 //****************************************************************************** -
trunk/src/user32/user32rsrc.orc
r4494 r4573 1 /* $Id: user32rsrc.orc,v 1. 3 2000-10-17 17:11:08sandervl Exp $ */1 /* $Id: user32rsrc.orc,v 1.4 2000-11-09 18:15:21 sandervl Exp $ */ 2 2 /* converted from WINE */ 3 3 … … 827 827 #define OIC_HDISK 32524 828 828 #define OIC_NETWORK 32525 829 830 OIC_SAMPLE ICON LOADONCALL DISCARDABLE "bmp\oic_sample.ico" 831 OIC_HAND ICON LOADONCALL DISCARDABLE "bmp\oic_hand_95.ico" 832 833 OIC_QUES ICON LOADONCALL DISCARDABLE "bmp\oic_ques_95.ico" 834 //OIC_BANG ICON LOADONCALL DISCARDABLE "bmp\oic_bang_95.ico" 835 836 /* folder */ 837 OIC_BANG ICON 838 {' 839 00 00 01 00 02 00 20 20 00 00 00 00 00 00 a8 08 840 00 00 26 00 00 00 10 10 00 00 00 00 00 00 68 05 841 00 00 ce 08 00 00 28 00 00 00 20 00 00 00 40 00 842 00 00 01 00 08 00 00 00 00 00 80 04 00 00 00 00 843 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 844 00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00 845 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00 c0 dc 846 c0 00 f0 ca a6 00 04 04 04 00 08 08 08 00 0c 0c 847 0c 00 11 11 11 00 16 16 16 00 1c 1c 1c 00 22 22 848 22 00 29 29 29 00 55 55 55 00 4d 4d 4d 00 42 42 849 42 00 39 39 39 00 80 7c ff 00 50 50 ff 00 93 00 850 d6 00 ff ec cc 00 c6 d6 ef 00 d6 e7 e7 00 90 a9 851 ad 00 00 00 33 00 00 00 66 00 00 00 99 00 00 00 852 cc 00 00 33 00 00 00 33 33 00 00 33 66 00 00 33 853 99 00 00 33 cc 00 00 33 ff 00 00 66 00 00 00 66 854 33 00 00 66 66 00 00 66 99 00 00 66 cc 00 00 66 855 ff 00 00 99 00 00 00 99 33 00 00 99 66 00 00 99 856 99 00 00 99 cc 00 00 99 ff 00 00 cc 00 00 00 cc 857 33 00 00 cc 66 00 00 cc 99 00 00 cc cc 00 00 cc 858 ff 00 00 ff 66 00 00 ff 99 00 00 ff cc 00 33 00 859 00 00 33 00 33 00 33 00 66 00 33 00 99 00 33 00 860 cc 00 33 00 ff 00 33 33 00 00 33 33 33 00 33 33 861 66 00 33 33 99 00 33 33 cc 00 33 33 ff 00 33 66 862 00 00 33 66 33 00 33 66 66 00 33 66 99 00 33 66 863 cc 00 33 66 ff 00 33 99 00 00 33 99 33 00 33 99 864 66 00 33 99 99 00 33 99 cc 00 33 99 ff 00 33 cc 865 00 00 33 cc 33 00 33 cc 66 00 33 cc 99 00 33 cc 866 cc 00 33 cc ff 00 33 ff 33 00 33 ff 66 00 33 ff 867 99 00 33 ff cc 00 33 ff ff 00 66 00 00 00 66 00 868 33 00 66 00 66 00 66 00 99 00 66 00 cc 00 66 00 869 ff 00 66 33 00 00 66 33 33 00 66 33 66 00 66 33 870 99 00 66 33 cc 00 66 33 ff 00 66 66 00 00 66 66 871 33 00 66 66 66 00 66 66 99 00 66 66 cc 00 66 99 872 00 00 66 99 33 00 66 99 66 00 66 99 99 00 66 99 873 cc 00 66 99 ff 00 66 cc 00 00 66 cc 33 00 66 cc 874 99 00 66 cc cc 00 66 cc ff 00 66 ff 00 00 66 ff 875 33 00 66 ff 99 00 66 ff cc 00 cc 00 ff 00 ff 00 876 cc 00 99 99 00 00 99 33 99 00 99 00 99 00 99 00 877 cc 00 99 00 00 00 99 33 33 00 99 00 66 00 99 33 878 cc 00 99 00 ff 00 99 66 00 00 99 66 33 00 99 33 879 66 00 99 66 99 00 99 66 cc 00 99 33 ff 00 99 99 880 33 00 99 99 66 00 99 99 99 00 99 99 cc 00 99 99 881 ff 00 99 cc 00 00 99 cc 33 00 66 cc 66 00 99 cc 882 99 00 99 cc cc 00 99 cc ff 00 99 ff 00 00 99 ff 883 33 00 99 cc 66 00 99 ff 99 00 99 ff cc 00 99 ff 884 ff 00 cc 00 00 00 99 00 33 00 cc 00 66 00 cc 00 885 99 00 cc 00 cc 00 99 33 00 00 cc 33 33 00 cc 33 886 66 00 cc 33 99 00 cc 33 cc 00 cc 33 ff 00 cc 66 887 00 00 cc 66 33 00 99 66 66 00 cc 66 99 00 cc 66 888 cc 00 99 66 ff 00 cc 99 00 00 cc 99 33 00 cc 99 889 66 00 cc 99 99 00 cc 99 cc 00 cc 99 ff 00 cc cc 890 00 00 cc cc 33 00 cc cc 66 00 cc cc 99 00 cc cc 891 cc 00 cc cc ff 00 cc ff 00 00 cc ff 33 00 99 ff 892 66 00 cc ff 99 00 cc ff cc 00 cc ff ff 00 cc 00 893 33 00 ff 00 66 00 ff 00 99 00 cc 33 00 00 ff 33 894 33 00 ff 33 66 00 ff 33 99 00 ff 33 cc 00 ff 33 895 ff 00 ff 66 00 00 ff 66 33 00 cc 66 66 00 ff 66 896 99 00 ff 66 cc 00 cc 66 ff 00 ff 99 00 00 ff 99 897 33 00 ff 99 66 00 ff 99 99 00 ff 99 cc 00 ff 99 898 ff 00 ff cc 00 00 ff cc 33 00 ff cc 66 00 ff cc 899 99 00 ff cc cc 00 ff cc ff 00 ff ff 33 00 cc ff 900 66 00 ff ff 99 00 ff ff cc 00 66 66 ff 00 66 ff 901 66 00 66 ff ff 00 ff 66 66 00 ff 66 ff 00 ff ff 902 66 00 21 00 a5 00 5f 5f 5f 00 77 77 77 00 86 86 903 86 00 96 96 96 00 cb cb cb 00 b2 b2 b2 00 d7 d7 904 d7 00 dd dd dd 00 e3 e3 e3 00 ea ea ea 00 f1 f1 905 f1 00 f8 f8 f8 00 f0 fb ff 00 a4 a0 a0 00 80 80 906 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00 ff 00 907 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00 00 00 908 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 909 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 910 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 911 00 00 6d 92 00 86 00 00 00 00 00 00 00 00 00 00 912 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 913 92 6d d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 914 00 00 00 00 00 00 00 00 00 00 00 00 00 00 92 6d 915 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 916 00 00 00 00 00 00 00 00 00 00 00 00 6d 92 d6 d6 917 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 918 00 00 00 00 00 00 00 00 00 00 6d 92 d6 d6 dd d6 919 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 920 00 00 00 00 00 00 00 00 92 6d d6 dd d6 d6 d6 d6 921 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 922 00 00 00 00 00 00 92 6d dd d6 d6 d6 d6 d6 d6 d6 923 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 924 00 00 00 00 6d 92 dd d6 d6 dd dd d6 d6 dd d6 d6 925 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 926 00 00 6d 92 dd dd dd dd dd d6 dd d6 d6 d6 d6 d6 927 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 928 92 6d dd dd dd d6 dd d6 dd dd d6 dd dd d6 d6 d6 929 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 930 dd dd dd dd dd dd d6 dd dd d6 dd d6 dd d6 d6 d6 931 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 932 dd dd dd dd dd dd dd dd dd dd dd dd d6 dd d6 dd 933 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 934 dd dd dd dd dd dd dd d6 dd dd d6 d6 dd d6 d6 d6 935 d6 d6 d6 d6 00 86 00 00 00 00 00 00 00 00 00 00 936 dd dd dd dd dd dd dd dd dd d6 dd dd d6 dd dd dd 937 d6 d6 d6 d6 00 d6 00 00 00 00 00 00 00 00 00 00 938 dd dd dd dd dd dd dd dd dd dd dd dd dd d6 d6 dd 939 d6 dd d6 d6 00 d6 00 00 00 00 00 00 00 00 00 00 940 dd dd dd dd dd dd dd dd dd dd d6 d6 dd dd dd dd 941 d6 d6 d6 d6 00 d6 00 00 00 00 00 00 00 00 00 00 942 dd dd dd dd dd dd dd dd d6 dd dd dd dd dd d6 dd 943 d6 d6 00 00 d6 d6 00 00 00 00 00 00 00 00 00 00 944 dd dd dd dd dd dd dd dd dd dd dd d6 dd dd dd d6 945 00 00 d6 d6 d6 d6 00 00 00 00 00 00 00 00 00 00 946 dd dd dd dd dd dd dd dd dd dd dd dd dd d6 00 00 947 d6 d6 d6 d6 00 00 00 00 00 00 00 00 00 00 00 00 948 dd dd dd dd dd dd dd dd dd dd dd dd 00 00 d6 d6 949 d6 d6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 950 dd dd dd dd dd dd dd dd dd dd 00 00 d6 d6 d6 d6 951 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 952 dd dd dd dd dd dd dd dd 00 00 d6 d6 d6 d6 00 00 953 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 954 dd dd dd dd dd dd 00 00 d6 d6 d6 d6 00 00 00 00 955 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 956 dd dd dd dd 00 00 d6 d6 d6 d6 d6 00 00 00 00 00 957 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 958 dd dd 00 00 d6 d6 d6 d6 d6 d6 d6 00 00 00 00 00 959 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 960 00 00 d6 d6 d6 d6 d6 d6 d6 d6 00 00 00 00 00 00 961 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 962 00 00 d6 d6 d6 d6 d6 d6 d6 d6 00 00 00 00 00 00 963 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 964 00 00 00 d6 d6 d6 d6 d6 00 00 00 00 00 00 00 00 965 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 966 00 00 00 d6 d6 00 00 00 00 00 00 00 00 00 00 00 967 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 968 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 969 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 970 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 971 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff 972 f0 ff ff ff c0 7f ff ff 00 3f ff fc 00 1f ff f0 973 00 0f ff c0 00 03 ff 00 00 01 fc 00 00 00 f0 00 974 00 01 c0 00 00 07 80 00 00 0f 80 00 00 3f 80 00 975 00 7f 80 00 00 7f 80 00 00 7f 80 00 00 7f 80 00 976 00 7f 80 00 00 7f 80 00 00 7f 80 00 00 ff 80 00 977 03 ff 80 00 0f ff 80 00 3f ff 80 00 ff ff 80 03 978 ff ff 80 03 ff ff 80 03 ff ff e0 07 ff ff e0 07 979 ff ff f0 1f ff ff f8 ff ff ff ff ff ff ff 28 00 980 00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00 981 00 00 40 01 00 00 00 00 00 00 00 00 00 00 00 00 982 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 983 00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 984 00 00 c0 c0 c0 00 c0 dc c0 00 f0 ca a6 00 04 04 985 04 00 08 08 08 00 0c 0c 0c 00 11 11 11 00 16 16 986 16 00 1c 1c 1c 00 22 22 22 00 29 29 29 00 55 55 987 55 00 4d 4d 4d 00 42 42 42 00 39 39 39 00 80 7c 988 ff 00 50 50 ff 00 93 00 d6 00 ff ec cc 00 c6 d6 989 ef 00 d6 e7 e7 00 90 a9 ad 00 00 00 33 00 00 00 990 66 00 00 00 99 00 00 00 cc 00 00 33 00 00 00 33 991 33 00 00 33 66 00 00 33 99 00 00 33 cc 00 00 33 992 ff 00 00 66 00 00 00 66 33 00 00 66 66 00 00 66 993 99 00 00 66 cc 00 00 66 ff 00 00 99 00 00 00 99 994 33 00 00 99 66 00 00 99 99 00 00 99 cc 00 00 99 995 ff 00 00 cc 00 00 00 cc 33 00 00 cc 66 00 00 cc 996 99 00 00 cc cc 00 00 cc ff 00 00 ff 66 00 00 ff 997 99 00 00 ff cc 00 33 00 00 00 33 00 33 00 33 00 998 66 00 33 00 99 00 33 00 cc 00 33 00 ff 00 33 33 999 00 00 33 33 33 00 33 33 66 00 33 33 99 00 33 33 1000 cc 00 33 33 ff 00 33 66 00 00 33 66 33 00 33 66 1001 66 00 33 66 99 00 33 66 cc 00 33 66 ff 00 33 99 1002 00 00 33 99 33 00 33 99 66 00 33 99 99 00 33 99 1003 cc 00 33 99 ff 00 33 cc 00 00 33 cc 33 00 33 cc 1004 66 00 33 cc 99 00 33 cc cc 00 33 cc ff 00 33 ff 1005 33 00 33 ff 66 00 33 ff 99 00 33 ff cc 00 33 ff 1006 ff 00 66 00 00 00 66 00 33 00 66 00 66 00 66 00 1007 99 00 66 00 cc 00 66 00 ff 00 66 33 00 00 66 33 1008 33 00 66 33 66 00 66 33 99 00 66 33 cc 00 66 33 1009 ff 00 66 66 00 00 66 66 33 00 66 66 66 00 66 66 1010 99 00 66 66 cc 00 66 99 00 00 66 99 33 00 66 99 1011 66 00 66 99 99 00 66 99 cc 00 66 99 ff 00 66 cc 1012 00 00 66 cc 33 00 66 cc 99 00 66 cc cc 00 66 cc 1013 ff 00 66 ff 00 00 66 ff 33 00 66 ff 99 00 66 ff 1014 cc 00 cc 00 ff 00 ff 00 cc 00 99 99 00 00 99 33 1015 99 00 99 00 99 00 99 00 cc 00 99 00 00 00 99 33 1016 33 00 99 00 66 00 99 33 cc 00 99 00 ff 00 99 66 1017 00 00 99 66 33 00 99 33 66 00 99 66 99 00 99 66 1018 cc 00 99 33 ff 00 99 99 33 00 99 99 66 00 99 99 1019 99 00 99 99 cc 00 99 99 ff 00 99 cc 00 00 99 cc 1020 33 00 66 cc 66 00 99 cc 99 00 99 cc cc 00 99 cc 1021 ff 00 99 ff 00 00 99 ff 33 00 99 cc 66 00 99 ff 1022 99 00 99 ff cc 00 99 ff ff 00 cc 00 00 00 99 00 1023 33 00 cc 00 66 00 cc 00 99 00 cc 00 cc 00 99 33 1024 00 00 cc 33 33 00 cc 33 66 00 cc 33 99 00 cc 33 1025 cc 00 cc 33 ff 00 cc 66 00 00 cc 66 33 00 99 66 1026 66 00 cc 66 99 00 cc 66 cc 00 99 66 ff 00 cc 99 1027 00 00 cc 99 33 00 cc 99 66 00 cc 99 99 00 cc 99 1028 cc 00 cc 99 ff 00 cc cc 00 00 cc cc 33 00 cc cc 1029 66 00 cc cc 99 00 cc cc cc 00 cc cc ff 00 cc ff 1030 00 00 cc ff 33 00 99 ff 66 00 cc ff 99 00 cc ff 1031 cc 00 cc ff ff 00 cc 00 33 00 ff 00 66 00 ff 00 1032 99 00 cc 33 00 00 ff 33 33 00 ff 33 66 00 ff 33 1033 99 00 ff 33 cc 00 ff 33 ff 00 ff 66 00 00 ff 66 1034 33 00 cc 66 66 00 ff 66 99 00 ff 66 cc 00 cc 66 1035 ff 00 ff 99 00 00 ff 99 33 00 ff 99 66 00 ff 99 1036 99 00 ff 99 cc 00 ff 99 ff 00 ff cc 00 00 ff cc 1037 33 00 ff cc 66 00 ff cc 99 00 ff cc cc 00 ff cc 1038 ff 00 ff ff 33 00 cc ff 66 00 ff ff 99 00 ff ff 1039 cc 00 66 66 ff 00 66 ff 66 00 66 ff ff 00 ff 66 1040 66 00 ff 66 ff 00 ff ff 66 00 21 00 a5 00 5f 5f 1041 5f 00 77 77 77 00 86 86 86 00 96 96 96 00 cb cb 1042 cb 00 b2 b2 b2 00 d7 d7 d7 00 dd dd dd 00 e3 e3 1043 e3 00 ea ea ea 00 f1 f1 f1 00 f8 f8 f8 00 f0 fb 1044 ff 00 a4 a0 a0 00 80 80 80 00 00 00 ff 00 00 ff 1045 00 00 00 ff ff 00 ff 00 00 00 ff 00 ff 00 ff ff 1046 00 00 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 1047 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1048 00 00 00 00 00 00 00 00 92 6d 92 92 6d 92 92 6d 1049 92 92 6d 92 6d 00 00 00 00 00 00 00 00 00 00 00 1050 00 00 00 00 92 00 00 00 ff dd dd dd dd d6 d6 d6 1051 d6 d6 d6 00 92 00 00 00 ff dd dd dd dd dd dd d6 1052 d6 d6 d6 00 6d 00 00 00 ff dd dd dd dd dd dd dd 1053 d6 d6 d6 00 92 00 00 00 ff dd dd dd dd dd dd dd 1054 d6 d6 d6 00 92 00 00 00 ff dd dd dd dd dd dd dd 1055 d6 d6 d6 00 6d 00 00 00 ff dd dd dd dd dd dd dd 1056 dd dd d6 00 92 00 00 00 ff ff ff ff ff ff ff ff 1057 ff ff c3 00 00 00 00 00 d6 d6 d6 d6 d6 d6 d6 00 1058 00 00 00 00 00 00 00 00 00 d6 d6 d6 d6 d6 00 00 1059 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1061 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1062 00 00 00 00 00 00 ff ff 00 00 ff ff 00 00 c0 01 1063 00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01 1064 00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 03 1065 00 00 80 03 00 00 c0 7f 00 00 e0 ff 00 00 ff ff 1066 00 00 ff ff 00 00 1067 '} 1068 1069 OIC_NOTE ICON LOADONCALL DISCARDABLE "bmp\oic_note_95.ico" 1070 OIC_PORTRAIT ICON LOADONCALL DISCARDABLE "bmp\oic_portrait.ico" 1071 OIC_LANDSCAPE ICON LOADONCALL DISCARDABLE "bmp\oic_landscape.ico" 1072 OIC_ODINICON ICON LOADONCALL DISCARDABLE "bmp\oic_sample.ico" 1073 OIC_FOLDER ICON LOADONCALL DISCARDABLE "bmp\oic_folder.ico" 1074 OIC_FOLDER2 ICON LOADONCALL DISCARDABLE "bmp\oic_folder2.ico" 1075 OIC_FLOPPY ICON LOADONCALL DISCARDABLE "bmp\oic_floppy.ico" 1076 OIC_CDROM ICON LOADONCALL DISCARDABLE "bmp\oic_cdrom.ico" 1077 OIC_HDISK ICON LOADONCALL DISCARDABLE "bmp\oic_hdisk.ico" 1078 OIC_NETWORK ICON LOADONCALL DISCARDABLE "bmp\oic_network.ico" 829 1079 830 1080 /* Cursors */ -
trunk/src/user32/win32wmdichild.cpp
r3625 r4573 1 /* $Id: win32wmdichild.cpp,v 1.2 4 2000-05-28 16:43:47sandervl Exp $ */1 /* $Id: win32wmdichild.cpp,v 1.25 2000-11-09 18:15:22 sandervl Exp $ */ 2 2 /* 3 3 * Win32 MDI Child Window Class for OS/2 … … 522 522 return; 523 523 } 524 MapWindowPoints(client->getParent()->getWindowHandle(), client->getWindowHandle(), (LPPOINT)&rect, 2); 524 //SvL: No mapping required as our client rectangle is in frame coordinates (not relative to parent!) 525 ///// MapWindowPoints(client->getParent()->getWindowHandle(), client->getWindowHandle(), (LPPOINT)&rect, 2); 525 526 526 527 AdjustWindowRectEx( &rect, getStyle(), 0, getExStyle()); -
trunk/src/user32/window.cpp
r4551 r4573 1 /* $Id: window.cpp,v 1.8 2 2000-11-04 16:28:26sandervl Exp $ */1 /* $Id: window.cpp,v 1.83 2000-11-09 18:15:22 sandervl Exp $ */ 2 2 /* 3 3 * Win32 window apis for OS/2 … … 266 266 } 267 267 268 dprintf(("USER32: CreateMDIWindowA\n"));269 268 cs.szClass = lpszClassName; 270 269 cs.szTitle = lpszWindowName; … … 276 275 cs.style = dwStyle; 277 276 cs.lParam = lParam; 277 278 if(HIWORD(lpszClassName)) { 279 dprintf(("CreateMDIWindowA: class %s parent %x (%d,%d) (%d,%d), %x %x lParam=%x", lpszClassName, hwndParent, x, y, nWidth, nHeight, dwStyle, lParam)); 280 } 281 else dprintf(("CreateMDIWindowA: class %d parent %x (%d,%d) (%d,%d), %x %x lParam=%x", lpszClassName, hwndParent, x, y, nWidth, nHeight, dwStyle, lParam)); 278 282 279 283 return window->SendMessageA(WM_MDICREATE, 0, (LPARAM)&cs); -
trunk/src/user32/winicon.cpp
r3209 r4573 1 /* $Id: winicon.cpp,v 1.1 0 2000-03-23 23:06:54sandervl Exp $ */1 /* $Id: winicon.cpp,v 1.11 2000-11-09 18:15:23 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Icon Code for OS/2 4 4 * 5 5 * 6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 8 * Parts based on Wine code (objects\bitmap.c, loader\resource.c, objects\cursoricon.c):6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) (OS/2 Port) 7 * 8 * Based on Wine code (objects\bitmap.c, loader\resource.c, objects\cursoricon.c): 9 9 * 10 10 * Copyright 1993 Alexandre Julliard … … 19 19 */ 20 20 #include <os2win.h> 21 #include <stdio.h> 22 #include <string.h> 21 23 #include <winicon.h> 22 24 #include <win\cursoricon.h> 23 24 #define DBG_LOCALLOG DBG_winicon 25 #include "dib.h" 26 #include <heapstring.h> 27 #include <win\virtual.h> 28 #include "initterm.h" 29 30 #define DBG_LOCALLOG DBG_winicon 25 31 #include "dbglocal.h" 26 32 33 static WORD ICON_HOTSPOT = 0x4242; 34 35 static HGLOBAL CURSORICON_CreateFromResource( HINSTANCE hInstance, HGLOBAL hObj, LPBYTE bits, 36 UINT cbSize, BOOL bIcon, DWORD dwVersion, 37 INT width, INT height, UINT loadflags ); 38 static HGLOBAL CURSORICON_Copy( HINSTANCE hInstance, HGLOBAL handle ); 39 static CURSORICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, 40 int height, int colors ); 41 static CURSORICONDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, 42 int width, int height, int color); 43 BOOL CURSORICON_SimulateLoadingFromResourceW( LPWSTR filename, BOOL fCursor, 44 CURSORICONDIR **res, LPBYTE **ptr); 45 46 /*********************************************************************** 47 * CreateIcon (USER32.75) 48 */ 49 HICON WIN32API CreateIcon(HINSTANCE hInstance, INT nWidth, 50 INT nHeight, BYTE bPlanes, BYTE bBitsPixel, 51 LPCVOID lpANDbits, LPCVOID lpXORbits ) 52 { 53 CURSORICONINFO info; 54 55 dprintf(("USER32: CreateIcon (%d,%d), %d, %x, %x", nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits)); 56 57 info.ptHotSpot.x = ICON_HOTSPOT; 58 info.ptHotSpot.y = ICON_HOTSPOT; 59 info.nWidth = nWidth; 60 info.nHeight = nHeight; 61 info.nWidthBytes = 0; 62 info.bPlanes = bPlanes; 63 info.bBitsPerPixel = bBitsPixel; 64 65 return CreateCursorIconIndirect(0, &info, lpANDbits, lpXORbits); 66 } 67 /********************************************************************** 68 * CreateIconFromResource (USER32.76) 69 */ 70 HICON WIN32API CreateIconFromResource(LPBYTE bits, UINT cbSize, 71 BOOL bIcon, DWORD dwVersion) 72 { 73 return CreateIconFromResourceEx( bits, cbSize, bIcon, dwVersion, 0,0,0); 74 } 27 75 //****************************************************************************** 28 76 //****************************************************************************** 29 HICON WIN32API CreateIcon( HINSTANCE arg1, INT arg2, INT arg3, BYTE arg4, BYTE arg5, LPCVOID arg6, LPCVOID arg7) 30 { 31 dprintf(("USER32: CreateIcon\n")); 32 return O32_CreateIcon(arg1, arg2, arg3, arg4, arg5, (const BYTE *)arg6, (const BYTE *)arg7); 33 } 34 //****************************************************************************** 35 //ASSERT dwVer == win31 (ok according to SDK docs) 36 //****************************************************************************** 37 HICON WIN32API CreateIconFromResource(PBYTE presbits, UINT dwResSize, 38 BOOL fIcon, DWORD dwVer) 39 { 40 HICON hicon; 41 DWORD OS2ResSize = 0; 42 PBYTE OS2Icon = ConvertWin32Icon(presbits, dwResSize, &OS2ResSize); 43 44 hicon = O32_CreateIconFromResource(OS2Icon, OS2ResSize, fIcon, dwVer); 45 dprintf(("USER32: CreateIconFromResource returned %X (%X)\n", hicon, GetLastError())); 46 if(OS2Icon) 47 FreeIcon(OS2Icon); 48 49 return(hicon); 50 } 51 //****************************************************************************** 52 //****************************************************************************** 53 HICON WIN32API CreateIconFromResourceEx(PBYTE presbits, UINT dwResSize, 54 BOOL fIcon, DWORD dwVer, 55 int cxDesired, int cyDesired, 56 UINT Flags) 57 { 58 dprintf(("USER32: CreateIconFromResourceEx %X %d %d %X %d %d %X, not completely supported!\n", presbits, dwResSize, fIcon, dwVer, cxDesired, cyDesired, Flags)); 59 return CreateIconFromResource(presbits, dwResSize, fIcon, dwVer); 60 } 61 //****************************************************************************** 62 //****************************************************************************** 63 HICON WIN32API CreateIconIndirect(LPICONINFO pIcon) 64 { 65 HICON hIcon; 66 HDC hdcSrc, hdcDst; 67 68 dprintf(("USER32: CreateIconIndirect\n")); 69 if(pIcon->hbmMask && pIcon->hbmColor) 70 { 71 ICONINFO iconinfo; 72 SIZE bmpsize; 73 74 iconinfo = *pIcon; 75 if(GetBitmapDimensionEx(pIcon->hbmColor, &bmpsize) == FALSE) { 76 return 0; 77 } 78 //if there's a color bitmap, the mask bitmap contains only the AND bits 79 //Open32 calls WinCreatePointerIndirect which expects AND & XOR bits 80 //To solve this we create a bitmap that's 2x height of the mask, copy 81 //the AND bits and set the XOR bits to 0 82 hdcSrc = CreateCompatibleDC(0); 83 hdcDst = CreateCompatibleDC(0); 84 85 iconinfo.hbmMask = CreateCompatibleBitmap (hdcDst, bmpsize.cx, bmpsize.cy*2); 86 SelectObject (hdcDst, iconinfo.hbmMask); 87 SelectObject (hdcSrc, pIcon->hbmMask); 88 BitBlt (hdcDst, 0, 0, bmpsize.cx, bmpsize.cy, 89 hdcSrc, 0, 0, SRCCOPY); 90 PatBlt (hdcDst, bmpsize.cx, bmpsize.cy, bmpsize.cx, bmpsize.cy, BLACKNESS); 91 92 hIcon = O32_CreateIconIndirect(&iconinfo); 93 94 DeleteObject(iconinfo.hbmMask); 95 DeleteDC(hdcSrc); 96 DeleteDC(hdcDst); 97 98 return hIcon; 99 } 100 hIcon = O32_CreateIconIndirect(pIcon); 101 if(hIcon == 0) { 102 dprintf(("CreateIconIndirect %d (%d,%d) %x %x failed with %x", pIcon->fIcon, pIcon->xHotspot, pIcon->yHotspot, pIcon->hbmMask, pIcon->hbmColor, GetLastError())); 103 } 104 return hIcon; 105 } 106 //****************************************************************************** 107 //****************************************************************************** 108 HICON CreateIconIndirect(LPICONINFO pIcon, BOOL bIsIcon, int desiredX, int desiredY, DWORD flags) 109 { 110 HICON hIcon; 111 HDC hdcSrc, hdcDst; 112 BITMAP bmp; 113 114 if(pIcon->hbmMask && pIcon->hbmColor) 115 { 116 ICONINFO iconinfo; 117 HBITMAP hbmOldSrc, hbmOldDst; 118 119 iconinfo = *pIcon; 120 GetObjectA(pIcon->hbmColor, sizeof(BITMAP), (LPVOID)&bmp); 121 122 //if there's a color bitmap, the mask bitmap contains only the AND bits 123 //Open32 calls WinCreatePointerIndirect which expects AND & XOR bits 124 //To solve this we create a bitmap that's 2x height of the mask, copy 125 //the AND bits and set the XOR bits to 0 126 hdcSrc = CreateCompatibleDC(0); 127 hdcDst = CreateCompatibleDC(0); 128 129 iconinfo.hbmMask = CreateCompatibleBitmap (hdcDst, desiredX, desiredY*2); 130 hbmOldDst = SelectObject (hdcDst, iconinfo.hbmMask); 131 hbmOldSrc = SelectObject (hdcSrc, pIcon->hbmMask); 132 if(desiredX != bmp.bmWidth || desiredY != bmp.bmHeight) { 133 StretchBlt(hdcDst, 0, 0, desiredX, desiredY, hdcSrc, 0, 0, 134 bmp.bmWidth, bmp.bmHeight, SRCCOPY); 135 } 136 else { 137 BitBlt (hdcDst, 0, 0, bmp.bmWidth, bmp.bmHeight, 138 hdcSrc, 0, 0, SRCCOPY); 139 } 140 PatBlt (hdcDst, desiredX, desiredY, desiredX, desiredY, BLACKNESS); 141 142 if(desiredX != bmp.bmWidth || desiredY != bmp.bmHeight) { 143 iconinfo.hbmColor = CreateCompatibleBitmap (hdcDst, desiredX, desiredY); 144 SelectObject (hdcDst, iconinfo.hbmColor); 145 SelectObject (hdcSrc, pIcon->hbmColor); 146 StretchBlt(hdcDst, 0, 0, desiredX, desiredY, hdcSrc, 0, 0, 147 bmp.bmWidth, bmp.bmHeight, SRCCOPY); 148 } 149 150 hIcon = O32_CreateIconIndirect(&iconinfo); 151 152 DeleteObject(iconinfo.hbmMask); 153 if(desiredX != bmp.bmWidth || desiredY != bmp.bmHeight) { 154 DeleteObject(iconinfo.hbmColor); 155 } 156 SelectObject (hdcDst, hbmOldDst); 157 SelectObject (hdcSrc, hbmOldSrc); 158 DeleteDC(hdcSrc); 159 DeleteDC(hdcDst); 160 161 return hIcon; 162 } 163 hIcon = O32_CreateIconIndirect(pIcon); 164 if(hIcon == 0) { 165 dprintf(("CreateIconIndirect %d (%d,%d) %x %x failed with %x", pIcon->fIcon, pIcon->xHotspot, pIcon->yHotspot, pIcon->hbmMask, pIcon->hbmColor, GetLastError())); 166 } 167 return hIcon; 77 HICON WIN32API CreateIconFromResourceEx(LPBYTE bits, UINT cbSize, 78 BOOL bIcon, DWORD dwVersion, 79 INT width, INT height, 80 UINT cFlag ) 81 { 82 dprintf(("USER32: CreateIconFromResourceEx %X %d %d %X %d %d %X,", bits, cbSize, bIcon, dwVersion, width, height, cFlag)); 83 return CURSORICON_CreateFromResource(0, 0, bits, cbSize, bIcon, dwVersion, width, height, cFlag ); 84 } 85 /********************************************************************** 86 * CreateIconIndirect (USER32.78) 87 */ 88 HICON WINAPI CreateIconIndirect(ICONINFO *iconinfo) 89 { 90 BITMAP bmpXor,bmpAnd; 91 HICON hObj; 92 int sizeXor,sizeAnd; 93 94 dprintf(("USER32: CreateIconIndirect %x", iconinfo)); 95 96 GetObjectA( iconinfo->hbmColor, sizeof(bmpXor), &bmpXor ); 97 GetObjectA( iconinfo->hbmMask, sizeof(bmpAnd), &bmpAnd ); 98 99 sizeXor = bmpXor.bmHeight * bmpXor.bmWidthBytes; 100 sizeAnd = bmpAnd.bmHeight * bmpAnd.bmWidthBytes; 101 102 hObj = GlobalAlloc( GMEM_MOVEABLE, sizeof(CURSORICONINFO) + sizeXor + sizeAnd ); 103 if (hObj) 104 { 105 CURSORICONINFO *info; 106 107 info = (CURSORICONINFO *)GlobalLock( hObj ); 108 109 /* If we are creating an icon, the hotspot is unused */ 110 if (iconinfo->fIcon) 111 { 112 info->ptHotSpot.x = ICON_HOTSPOT; 113 info->ptHotSpot.y = ICON_HOTSPOT; 114 } 115 else 116 { 117 info->ptHotSpot.x = iconinfo->xHotspot; 118 info->ptHotSpot.y = iconinfo->yHotspot; 119 } 120 121 info->nWidth = bmpXor.bmWidth; 122 info->nHeight = bmpXor.bmHeight; 123 info->nWidthBytes = bmpXor.bmWidthBytes; 124 info->bPlanes = bmpXor.bmPlanes; 125 info->bBitsPerPixel = bmpXor.bmBitsPixel; 126 127 /* Transfer the bitmap bits to the CURSORICONINFO structure */ 128 GetBitmapBits( iconinfo->hbmMask ,sizeAnd,(char*)(info + 1) ); 129 GetBitmapBits( iconinfo->hbmColor,sizeXor,(char*)(info + 1) +sizeAnd); 130 GlobalUnlock(hObj); 131 } 132 else { 133 dprintf(("ERROR: CreateIconIndirect GlobalAlloc failed!!")); 134 } 135 return hObj; 168 136 } 169 137 //****************************************************************************** … … 172 140 { 173 141 dprintf(("USER32: DestroyIcon %x", hIcon)); 174 return O32_DestroyIcon(hIcon);142 return CURSORICON_Destroy( hIcon, 0 ); 175 143 } 176 144 //****************************************************************************** … … 179 147 { 180 148 dprintf(("USER32: CopyIcon %x", hIcon)); 181 return O32_CopyIcon(hIcon); 182 } 183 //****************************************************************************** 184 //WARNING: MEMORY LEAK & DIRTY HACK TO WORK AROUND OPEN32 BUG 185 //OS/2 icon masks must be twice the height of the color bitmap 186 //In Windows, the mask only contains the AND data if there's a color bitmap 187 //--->> We're allocating a bitmap to replace the mask bitmap, but DON'T DELETE it! 188 //WARNING: DIRTY HACK TO WORK AROUND OPEN32 BUG 189 //****************************************************************************** 190 BOOL WIN32API GetIconInfo( HICON hIcon, LPICONINFO pIconInfo) 191 { 192 BOOL rc; 193 HBITMAP hbmMask, hbmOldSrc, hbmOldDst; 194 BITMAP bmp; 195 196 dprintf(("USER32: GetIconInfo %x", hIcon)); 197 rc = O32_GetIconInfo(hIcon, pIconInfo); 149 return CURSORICON_Copy( 0, hIcon ); 150 } 151 /********************************************************************** 152 * GetIconInfo (USER32.242) 153 */ 154 BOOL WINAPI GetIconInfo(HICON hIcon, ICONINFO *iconinfo) 155 { 156 CURSORICONINFO *ciconinfo; 157 158 dprintf(("GetIconInfo %x %x", hIcon, iconinfo)); 159 160 ciconinfo = (CURSORICONINFO *)GlobalLock((HGLOBAL)hIcon); 161 if (!ciconinfo) 162 return FALSE; 163 164 if((ciconinfo->ptHotSpot.x == ICON_HOTSPOT) && 165 (ciconinfo->ptHotSpot.y == ICON_HOTSPOT)) 166 { 167 iconinfo->fIcon = TRUE; 168 iconinfo->xHotspot = ciconinfo->nWidth / 2; 169 iconinfo->yHotspot = ciconinfo->nHeight / 2; 170 } 171 else 172 { 173 iconinfo->fIcon = FALSE; 174 iconinfo->xHotspot = ciconinfo->ptHotSpot.x; 175 iconinfo->yHotspot = ciconinfo->ptHotSpot.y; 176 } 177 178 //Create new bitmaps for the color and mask data; application is responsible 179 //for deleteing them (according to docs & verified in NT4) 180 if(ciconinfo->bBitsPerPixel > 1) 181 { 182 BITMAPINFO* pInfo; 183 int colorsize = 0; 184 int coloroff; 185 186 HDC hdc = CreateCompatibleDC(0); 187 188 if(ciconinfo->bBitsPerPixel <= 8) { 189 colorsize = (1<<ciconinfo->bBitsPerPixel)*sizeof(RGBQUAD); 190 } 191 else { 192 colorsize = 3*sizeof(DWORD); //color masks 193 } 194 pInfo = (BITMAPINFO *)malloc(ciconinfo->nHeight * ciconinfo->nWidthBytes + colorsize + sizeof(BITMAPINFO)); 195 memset(pInfo, 0, sizeof(BITMAPINFO)+colorsize); 196 197 pInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 198 pInfo->bmiHeader.biWidth = ciconinfo->nWidth; 199 pInfo->bmiHeader.biHeight = ciconinfo->nHeight, 200 pInfo->bmiHeader.biPlanes = ciconinfo->bPlanes; 201 pInfo->bmiHeader.biBitCount = ciconinfo->bBitsPerPixel; 202 pInfo->bmiHeader.biSizeImage= ciconinfo->nHeight * ciconinfo->nWidthBytes; 203 204 //offset in cursorinfo memory 205 coloroff = ciconinfo->nHeight * BITMAP_GetWidthBytes (ciconinfo->nWidth, 1); 206 207 char *src = (char *)(ciconinfo + 1) + coloroff; 208 if(ciconinfo->bBitsPerPixel <= 8) { 209 src += colorsize; //no color masks in cursorinfo data for bpp > 8 210 } 211 if(ciconinfo->bBitsPerPixel <= 8) { 212 memcpy(&pInfo->bmiColors[0], (char *)(ciconinfo + 1) + coloroff, colorsize); 213 } 214 //else TODO: color masks (curerntly unused in CreateDIBitmap) 215 216 iconinfo->hbmColor = CreateDIBitmap(hdc, &pInfo->bmiHeader, CBM_INIT, src, pInfo, DIB_RGB_COLORS); 217 218 free(pInfo); 219 DeleteDC(hdc); 220 } 221 else { 222 iconinfo->hbmColor = CreateBitmap ( ciconinfo->nWidth, ciconinfo->nHeight, 223 ciconinfo->bPlanes, ciconinfo->bBitsPerPixel, 224 (char *)(ciconinfo + 1) 225 + ciconinfo->nHeight * 226 BITMAP_GetWidthBytes (ciconinfo->nWidth, 1) ); 227 } 228 229 iconinfo->hbmMask = CreateBitmap ( ciconinfo->nWidth, ciconinfo->nHeight, 230 1, 1, (char *)(ciconinfo + 1)); 231 232 GlobalUnlock(hIcon); 233 234 return TRUE; 235 } 236 /*********************************************************************** 237 * CreateCursorIconIndirect (USER.408) 238 */ 239 HGLOBAL WIN32API CreateCursorIconIndirect( HINSTANCE hInstance, 240 CURSORICONINFO *info, 241 LPCVOID lpANDbits, 242 LPCVOID lpXORbits ) 243 { 244 HGLOBAL handle; 245 char *ptr; 246 int sizeAnd, sizeXor; 247 248 if (!lpXORbits || !lpANDbits || info->bPlanes != 1) return 0; 249 info->nWidthBytes = BITMAP_GetWidthBytes(info->nWidth,info->bBitsPerPixel); 250 sizeXor = info->nHeight * info->nWidthBytes; 251 sizeAnd = info->nHeight * BITMAP_GetWidthBytes( info->nWidth, 1 ); 252 if (!(handle = GlobalAlloc( GMEM_MOVEABLE, 253 sizeof(CURSORICONINFO) + sizeXor + sizeAnd))) 254 return 0; 255 ptr = (char *)GlobalLock( handle ); 256 memcpy( ptr, info, sizeof(*info) ); 257 memcpy( ptr + sizeof(CURSORICONINFO), lpANDbits, sizeAnd ); 258 memcpy( ptr + sizeof(CURSORICONINFO) + sizeAnd, lpXORbits, sizeXor ); 259 GlobalUnlock( handle ); 260 return handle; 261 } 262 /********************************************************************** 263 * CURSORICON_Load 264 * 265 * Load a cursor or icon from resource or file. 266 */ 267 HGLOBAL CURSORICON_Load( HINSTANCE hInstance, LPCWSTR name, 268 INT width, INT height, INT colors, 269 BOOL fCursor, UINT loadflags ) 270 { 271 HANDLE handle = 0, h = 0; 272 HANDLE hRsrc; 273 CURSORICONDIR *dir; 274 CURSORICONDIRENTRY *dirEntry; 275 LPBYTE bits; 276 277 if ( loadflags & LR_LOADFROMFILE ) /* Load from file */ 278 { 279 LPBYTE *ptr; 280 if (!CURSORICON_SimulateLoadingFromResourceW((LPWSTR)name, fCursor, &dir, &ptr)) 281 return 0; 282 if (fCursor) 283 dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestCursor(dir, width, height, 1); 284 else 285 dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(dir, width, height, colors); 286 bits = ptr[dirEntry->wResId-1]; 287 h = CURSORICON_CreateFromResource( 0, 0, bits, dirEntry->dwBytesInRes, 288 !fCursor, 0x00030000, width, height, loadflags); 289 HeapFree( GetProcessHeap(), 0, dir ); 290 HeapFree( GetProcessHeap(), 0, ptr ); 291 } 292 else /* Load from resource */ 293 { 294 HANDLE hGroupRsrc; 295 WORD wResId; 296 DWORD dwBytesInRes; 297 BOOL bIsGroup = TRUE; 298 299 /* Get directory resource ID */ 300 if (!hInstance) 301 { 302 hRsrc = FindResourceW(hInstanceUser32, name, fCursor ? RT_CURSORW : RT_ICONW); 303 if(!hRsrc) { 304 hRsrc = FindResourceW(hInstanceUser32, name, fCursor ? RT_GROUP_CURSORW : RT_GROUP_ICONW); 305 } 306 else bIsGroup = FALSE; 307 308 if(!hRsrc) return 0; 309 310 hInstance = hInstanceUser32; 311 } 312 else { 313 hRsrc = FindResourceW(hInstance, name, fCursor ? RT_GROUP_CURSORW : RT_GROUP_ICONW); 314 if(!hRsrc) return 0; 315 } 316 hGroupRsrc = hRsrc; 317 318 if(bIsGroup) { 319 /* Find the best entry in the directory */ 320 321 if (!(handle = LoadResource( hInstance, hRsrc ))) return 0; 322 if (!(dir = (CURSORICONDIR*)LockResource( handle ))) return 0; 323 324 if (fCursor) 325 dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestCursor( dir, 326 width, height, 1); 327 else 328 dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon( dir, 329 width, height, colors ); 330 if (!dirEntry) return 0; 331 wResId = dirEntry->wResId; 332 dwBytesInRes = dirEntry->dwBytesInRes; 333 FreeResource( handle ); 334 335 /* Load the resource */ 336 if (!(hRsrc = FindResourceW(hInstance,MAKEINTRESOURCEW(wResId), 337 fCursor ? RT_CURSORW : RT_ICONW ))) return 0; 338 } 339 340 if (!(handle = LoadResource( hInstance, hRsrc ))) return 0; 341 bits = (LPBYTE)LockResource( handle ); 342 h = CURSORICON_CreateFromResource( 0, 0, bits, dwBytesInRes, 343 !fCursor, 0x00030000, width, height, loadflags); 344 FreeResource( handle ); 345 346 } 347 348 return h; 349 } 350 351 /********************************************************************* 352 * The main purpose of this function is to create fake resource directory 353 * and fake resource entries. There are several reasons for this: 354 * - CURSORICONDIR and CURSORICONFILEDIR differ in sizes and their 355 * fields 356 * There are some "bad" cursor files which do not have 357 * bColorCount initialized but instead one must read this info 358 * directly from corresponding DIB sections 359 * Note: wResId is index to array of pointer returned in ptrs (origin is 1) 360 */ 361 BOOL CURSORICON_SimulateLoadingFromResourceW( LPWSTR filename, BOOL fCursor, 362 CURSORICONDIR **res, LPBYTE **ptr) 363 { 364 LPBYTE _free; 365 CURSORICONFILEDIR *bits; 366 int entries, size, i; 367 HANDLE hMapping = 0; 368 369 *res = NULL; 370 *ptr = NULL; 371 372 hMapping = VIRTUAL_MapFileW( filename, (LPVOID *)&bits, TRUE); 373 if(hMapping == INVALID_HANDLE_VALUE) 374 return FALSE; 375 376 /* FIXME: test for inimated icons 377 * hack to load the first icon from the *.ani file 378 */ 379 if ( *(LPDWORD)bits==0x46464952 ) /* "RIFF" */ 380 { 381 LPBYTE pos = (LPBYTE) bits; 382 dprintf(("Animated icons not correctly implemented! %p \n", bits)); 383 384 for (;;) 385 { 386 if (*(LPDWORD)pos==0x6e6f6369) /* "icon" */ 387 { 388 dprintf(("icon entry found! %p\n", bits)); 389 pos+=4; 390 if ( !*(LPWORD) pos==0x2fe) /* iconsize */ 391 { 392 goto fail; 393 } 394 bits=(CURSORICONFILEDIR*)(pos+4); 395 dprintf(("icon size ok. offset=%p \n", bits)); 396 break; 397 } 398 pos+=2; 399 if (pos>=(LPBYTE)bits+766) goto fail; 400 } 401 } 402 if (!(entries = bits->idCount)) goto fail; 403 size = sizeof(CURSORICONDIR) + sizeof(CURSORICONDIRENTRY) * (entries - 1); 404 _free = (LPBYTE) size; 405 406 for (i=0; i < entries; i++) 407 size += bits->idEntries[i].dwDIBSize + (fCursor ? sizeof(POINT16): 0); 408 409 if (!(*ptr = (LPBYTE *)HeapAlloc( GetProcessHeap(), 0, 410 entries * sizeof (CURSORICONDIRENTRY*)))) goto fail; 411 if (!(*res = (CURSORICONDIR *)HeapAlloc( GetProcessHeap(), 0, size))) goto fail; 412 413 _free = (LPBYTE)(*res) + (int)_free; 414 memcpy((*res), bits, 6); 415 for (i=0; i<entries; i++) 416 { 417 ((LPBYTE*)(*ptr))[i] = _free; 418 if (fCursor) { 419 (*res)->idEntries[i].ResInfo.cursor.wWidth=bits->idEntries[i].bWidth; 420 (*res)->idEntries[i].ResInfo.cursor.wHeight=bits->idEntries[i].bHeight; 421 ((LPPOINT16)_free)->x=bits->idEntries[i].xHotspot; 422 ((LPPOINT16)_free)->y=bits->idEntries[i].yHotspot; 423 _free+=sizeof(POINT16); 424 } 425 else { 426 (*res)->idEntries[i].ResInfo.icon.bWidth=bits->idEntries[i].bWidth; 427 (*res)->idEntries[i].ResInfo.icon.bHeight=bits->idEntries[i].bHeight; 428 (*res)->idEntries[i].ResInfo.icon.bColorCount = bits->idEntries[i].bColorCount; 429 } 430 (*res)->idEntries[i].wPlanes=1; 431 (*res)->idEntries[i].wBitCount = ((LPBITMAPINFOHEADER)((LPBYTE)bits + 432 bits->idEntries[i].dwDIBOffset))->biBitCount; 433 (*res)->idEntries[i].dwBytesInRes = bits->idEntries[i].dwDIBSize; 434 (*res)->idEntries[i].wResId=i+1; 435 436 memcpy(_free,(LPBYTE)bits +bits->idEntries[i].dwDIBOffset, 437 (*res)->idEntries[i].dwBytesInRes); 438 _free += (*res)->idEntries[i].dwBytesInRes; 439 } 440 UnmapViewOfFile( bits ); 441 CloseHandle(hMapping); 442 return TRUE; 443 444 fail: 445 if (*res) HeapFree( GetProcessHeap(), 0, *res ); 446 if (*ptr) HeapFree( GetProcessHeap(), 0, *ptr ); 447 448 UnmapViewOfFile( bits ); 449 CloseHandle(hMapping); 450 return FALSE; 451 } 452 453 /********************************************************************** 454 * CURSORICON_CreateFromResource 455 * 456 * Create a cursor or icon from in-memory resource template. 457 * 458 * FIXME: Convert to mono when cFlag is LR_MONOCHROME. Do something 459 * with cbSize parameter as well. 460 */ 461 static HGLOBAL CURSORICON_CreateFromResource( HINSTANCE hInstance, HGLOBAL hObj, LPBYTE bits, 462 UINT cbSize, BOOL bIcon, DWORD dwVersion, 463 INT width, INT height, UINT loadflags ) 464 { 465 int sizeAnd, sizeXor; 466 HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */ 467 BITMAP bmpXor, bmpAnd; 468 POINT16 hotspot; 469 BITMAPINFO *bmi; 470 HDC hdc = 0; 471 BOOL DoStretch; 472 INT size, colortablesize; 473 474 hotspot.x = ICON_HOTSPOT; 475 hotspot.y = ICON_HOTSPOT; 476 477 if (dwVersion == 0x00020000) 478 { 479 dprintf(("CURSORICON_CreateFromResource 2.xx resources are not supported")); 480 return 0; 481 } 482 483 if (bIcon) { 484 bmi = (BITMAPINFO *)bits; 485 } 486 else /* get the hotspot */ 487 { 488 POINT16 *pt = (POINT16 *)bits; 489 hotspot = *pt; 490 bmi = (BITMAPINFO *)(pt + 1); 491 } 492 size = DIB_BitmapInfoSize(bmi, DIB_RGB_COLORS); 493 494 if (!width) width = bmi->bmiHeader.biWidth; 495 if (!height) height = bmi->bmiHeader.biHeight/2; 496 497 DoStretch = (bmi->bmiHeader.biHeight/2 != height) || (bmi->bmiHeader.biWidth != width); 498 499 /* Check bitmap header */ 500 if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) && 501 (bmi->bmiHeader.biSize != sizeof(BITMAPINFOHEADER) || 502 bmi->bmiHeader.biCompression != BI_RGB) ) 503 { 504 return 0; 505 } 506 507 if( (hdc = GetDC( 0 )) ) 508 { 509 BITMAPINFO* pInfo; 510 511 /* Make sure we have room for the monochrome bitmap later on. 512 * Note that BITMAPINFOINFO and BITMAPCOREHEADER are the same 513 * up to and including the biBitCount. In-memory icon resource 514 * format is as follows: 515 * 516 * BITMAPINFOHEADER icHeader // DIB header 517 * RGBQUAD icColors[] // Color table 518 * BYTE icXOR[] // DIB bits for XOR mask 519 * BYTE icAND[] // DIB bits for AND mask 520 */ 521 522 if ((pInfo = (BITMAPINFO *)HeapAlloc( GetProcessHeap(), 0, 523 max(size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD))))) 524 { 525 memcpy( pInfo, bmi, size ); 526 pInfo->bmiHeader.biHeight /= 2; 527 528 /* Create the XOR bitmap */ 529 if (DoStretch) 530 { 531 if(bIcon) 532 { 533 hXorBits = CreateCompatibleBitmap(hdc, width, height); 534 } 535 else 536 { 537 hXorBits = CreateBitmap(width, height, 1, 1, NULL); 538 } 539 if(hXorBits) 540 { 541 HBITMAP hOld; 542 HDC hMem = CreateCompatibleDC(hdc); 543 BOOL res; 544 545 if (hMem) { 546 hOld = SelectObject(hMem, hXorBits); 547 res = StretchDIBits(hMem, 0, 0, width, height, 0, 0, 548 bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight/2, 549 (char*)bmi + size, pInfo, DIB_RGB_COLORS, SRCCOPY); 550 SelectObject(hMem, hOld); 551 DeleteDC(hMem); 552 } 553 else res = FALSE; 554 if (!res) { 555 DeleteObject(hXorBits); 556 hXorBits = 0; 557 } 558 } 559 } 560 else 561 { 562 hXorBits = CreateDIBitmap(hdc, &pInfo->bmiHeader, 563 CBM_INIT, (char*)bmi + size, pInfo, DIB_RGB_COLORS ); 564 } 565 if( hXorBits ) 566 { 567 char* xbits = (char *)bmi + size + DIB_GetDIBImageBytes(bmi->bmiHeader.biWidth, 568 bmi->bmiHeader.biHeight, 569 bmi->bmiHeader.biBitCount) / 2; 570 571 pInfo->bmiHeader.biBitCount = 1; 572 if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) 573 { 574 RGBQUAD *rgb = pInfo->bmiColors; 575 576 pInfo->bmiHeader.biClrUsed = pInfo->bmiHeader.biClrImportant = 2; 577 rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00; 578 rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff; 579 rgb[0].rgbReserved = rgb[1].rgbReserved = 0; 580 } 581 else 582 { 583 RGBTRIPLE *rgb = (RGBTRIPLE *)(((BITMAPCOREHEADER *)pInfo) + 1); 584 585 rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00; 586 rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff; 587 } 588 589 /* Create the AND bitmap */ 590 if (DoStretch) 591 { 592 if ((hAndBits = CreateBitmap(width, height, 1, 1, NULL))) 593 { 594 HBITMAP hOld; 595 HDC hMem = CreateCompatibleDC(hdc); 596 BOOL res; 597 598 if (hMem) { 599 hOld = SelectObject(hMem, hAndBits); 600 res = StretchDIBits(hMem, 0, 0, width, height, 0, 0, 601 pInfo->bmiHeader.biWidth, pInfo->bmiHeader.biHeight, 602 xbits, pInfo, DIB_RGB_COLORS, SRCCOPY); 603 SelectObject(hMem, hOld); 604 DeleteDC(hMem); 605 } 606 else res = FALSE; 607 if (!res) { 608 DeleteObject(hAndBits); hAndBits = 0; 609 } 610 } 611 } 612 else { 613 //SvL: Must use CreateBitmap here as CreateDIBitmap converts data to 8bpp (GetObjectA info -> 8 bpp) 198 614 #if 1 199 if(rc && pIconInfo->hbmColor) 200 { 201 HDC hdcSrc, hdcDst; 202 hdcSrc = CreateCompatibleDC(0); 203 hdcDst = CreateCompatibleDC(0); 204 205 GetObjectA(pIconInfo->hbmColor, sizeof(BITMAP), (LPVOID)&bmp); 206 207 hbmMask = CreateCompatibleBitmap (hdcDst, bmp.bmWidth, bmp.bmHeight); 208 hbmOldDst = SelectObject (hdcDst, hbmMask); 209 hbmOldSrc = SelectObject (hdcSrc, pIconInfo->hbmMask); 210 BitBlt (hdcDst, 0, 0, bmp.bmWidth, bmp.bmHeight, 211 hdcSrc, 0, 0, SRCCOPY); 212 213 SelectObject(hdcDst, hbmOldDst); 214 SelectObject(hdcSrc, hbmOldSrc); 215 DeleteDC(hdcDst); 216 DeleteDC(hdcSrc); 217 DeleteObject(pIconInfo->hbmMask); 218 pIconInfo->hbmMask = hbmMask; 219 } 615 int linewidth = BITMAP_GetWidthBytes(width, 1); 616 617 char *newpix = (char *)malloc(linewidth*height); 618 619 newpix += ((height-1)*linewidth); 620 621 for(int i=0;i<height;i++) { 622 memcpy(newpix, xbits, linewidth); 623 newpix -= linewidth; 624 xbits += linewidth; 625 } 626 newpix += linewidth; 627 hAndBits = CreateBitmap(width, height, 1, 1, newpix); 628 629 free(newpix); 630 631 #else 632 hAndBits = CreateDIBitmap(hdc, &pInfo->bmiHeader, 633 CBM_INIT, xbits, pInfo, DIB_RGB_COLORS ); 220 634 #endif 221 return rc; 222 } 635 } 636 if( !hAndBits ) 637 DeleteObject( hXorBits ); 638 } 639 HeapFree( GetProcessHeap(), 0, pInfo ); 640 } 641 ReleaseDC( 0, hdc ); 642 } 643 644 if( !hXorBits || !hAndBits ) 645 { 646 dprintf(("\tunable to create an icon bitmap.\n")); 647 return 0; 648 } 649 650 /* Now create the CURSORICONINFO structure */ 651 GetObjectA( hXorBits, sizeof(bmpXor), &bmpXor ); 652 GetObjectA( hAndBits, sizeof(bmpAnd), &bmpAnd ); 653 colortablesize = 0; 654 655 if(bmpXor.bmBitsPixel <= 8) { 656 colortablesize = sizeof(RGBQUAD)*(1<<bmpXor.bmBitsPixel); 657 sizeXor = bmpXor.bmHeight * bmpXor.bmWidthBytes + colortablesize; 658 } 659 else sizeXor = bmpXor.bmHeight * bmpXor.bmWidthBytes; 660 661 sizeAnd = bmpAnd.bmHeight * bmpAnd.bmWidthBytes; 662 663 if (hObj) hObj = GlobalReAlloc( hObj, 664 sizeof(CURSORICONINFO) + sizeXor + sizeAnd, GMEM_MOVEABLE ); 665 if (!hObj) hObj = GlobalAlloc( GMEM_MOVEABLE, 666 sizeof(CURSORICONINFO) + sizeXor + sizeAnd ); 667 if (hObj) 668 { 669 CURSORICONINFO *info; 670 671 info = (CURSORICONINFO *)GlobalLock( hObj ); 672 info->ptHotSpot.x = hotspot.x; 673 info->ptHotSpot.y = hotspot.y; 674 info->nWidth = bmpXor.bmWidth; 675 info->nHeight = bmpXor.bmHeight; 676 info->nWidthBytes = bmpXor.bmWidthBytes; 677 info->bPlanes = bmpXor.bmPlanes; 678 info->bBitsPerPixel = bmpXor.bmBitsPixel; 679 info->hColorBmp = hXorBits; 680 681 /* Transfer the bitmap bits to the CURSORICONINFO structure */ 682 GetBitmapBits( hAndBits, sizeAnd, (char *)(info + 1)); 683 684 if(bmpXor.bmBitsPixel > 1) 685 { 686 BITMAPINFO* pInfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFO)+colortablesize+3*sizeof(DWORD)); //+ extra space for > 8bpp images 687 HBITMAP oldbmp; 688 689 hdc = CreateCompatibleDC(0); 690 691 pInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 692 pInfo->bmiHeader.biPlanes = info->bPlanes; 693 pInfo->bmiHeader.biBitCount = info->bBitsPerPixel; 694 695 GetDIBits(hdc, hXorBits, 0, bmpXor.bmHeight, (char *)(info + 1) + sizeAnd + colortablesize, pInfo, DIB_RGB_COLORS); 696 if(colortablesize) { 697 memcpy((char *)(info + 1) + sizeAnd, (char *)&pInfo->bmiHeader + pInfo->bmiHeader.biSize, colortablesize); 698 } 699 700 DeleteDC(hdc); 701 free(pInfo); 702 } 703 else { 704 GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd); 705 } 706 GlobalUnlock( hObj ); 707 } 708 709 DeleteObject( hAndBits ); 710 DeleteObject( hXorBits ); 711 return hObj; 712 } 713 714 /********************************************************************** 715 * CURSORICON_Destroy (USER.610) 716 * 717 * This routine is actually exported from Win95 USER under the name 718 * DestroyIcon32 ... The behaviour implemented here should mimic 719 * the Win95 one exactly, especially the return values, which 720 * depend on the setting of various flags. 721 */ 722 WORD WIN32API CURSORICON_Destroy( HGLOBAL handle, UINT flags ) 723 { 724 WORD retv; 725 726 #if 0 727 /* Check whether destroying active cursor */ 728 729 if ( hActiveCursor == handle ) 730 { 731 ERR_(cursor)("Destroying active cursor!\n" ); 732 SetCursor( 0 ); 733 } 734 /* Try shared cursor/icon first */ 735 736 if ( !(flags & CID_NONSHARED) ) 737 { 738 INT count = CURSORICON_DelSharedIcon( handle ); 739 740 if ( count != -1 ) 741 return (flags & CID_WIN32)? TRUE : (count == 0); 742 743 /* FIXME: OEM cursors/icons should be recognized */ 744 } 745 #endif 746 /* Now assume non-shared cursor/icon */ 747 748 retv = GlobalFree( handle ); 749 return (flags & CID_RESOURCE)? retv : TRUE; 750 } 751 752 /*********************************************************************** 753 * CURSORICON_Copy 754 * 755 * Make a copy of a cursor or icon. 756 */ 757 static HGLOBAL CURSORICON_Copy( HINSTANCE hInstance, HGLOBAL handle ) 758 { 759 char *ptrOld, *ptrNew; 760 int size; 761 HGLOBAL hNew; 762 763 if (!(ptrOld = (char *)GlobalLock( handle ))) return 0; 764 765 size = GlobalSize( handle ); 766 hNew = GlobalAlloc( GMEM_MOVEABLE, size ); 767 ptrNew = (char *)GlobalLock( hNew ); 768 memcpy( ptrNew, ptrOld, size ); 769 GlobalUnlock( handle ); 770 GlobalUnlock( hNew ); 771 return hNew; 772 } 773 774 /************************************************************************* 775 * CURSORICON_ExtCopy 776 * 777 * Copies an Image from the Cache if LR_COPYFROMRESOURCE is specified 778 * 779 * PARAMS 780 * Handle [I] handle to an Image 781 * nType [I] Type of Handle (IMAGE_CURSOR | IMAGE_ICON) 782 * iDesiredCX [I] The Desired width of the Image 783 * iDesiredCY [I] The desired height of the Image 784 * nFlags [I] The flags from CopyImage 785 * 786 * RETURNS 787 * Success: The new handle of the Image 788 * 789 * NOTES 790 * LR_COPYDELETEORG and LR_MONOCHROME are currently not implemented. 791 * LR_MONOCHROME should be implemented by CURSORICON_CreateFromResource. 792 * LR_COPYFROMRESOURCE will only work if the Image is in the Cache. 793 * 794 * 795 */ 796 797 HGLOBAL CURSORICON_ExtCopy(HGLOBAL Handle, UINT nType, 798 INT iDesiredCX, INT iDesiredCY, 799 UINT nFlags) 800 { 801 HGLOBAL hNew=0; 802 803 if(Handle == 0) 804 { 805 return 0; 806 } 807 808 hNew = CURSORICON_Copy(0, Handle); 809 return hNew; 810 } 811 223 812 /********************************************************************** 224 813 * CURSORICON_FindBestIcon … … 329 918 } 330 919 /********************************************************************** 331 * LookupIconIdFromDirectoryEx 16(USER.364)920 * LookupIconIdFromDirectoryEx (USER.364) 332 921 * 333 922 * FIXME: exact parameter sizes … … 373 962 bIcon ? GetSystemMetrics(SM_CYICON) : GetSystemMetrics(SM_CYCURSOR), bIcon ? 0 : LR_MONOCHROME ); 374 963 } 375 /*************************************************************************376 * CURSORICON_ExtCopy377 *378 * Copies an Image from the Cache if LR_COPYFROMRESOURCE is specified379 *380 * PARAMS381 * Handle [I] handle to an Image382 * nType [I] Type of Handle (IMAGE_CURSOR | IMAGE_ICON)383 * iDesiredCX [I] The Desired width of the Image384 * iDesiredCY [I] The desired height of the Image385 * nFlags [I] The flags from CopyImage386 *387 * RETURNS388 * Success: The new handle of the Image389 *390 * NOTES391 * LR_COPYDELETEORG and LR_MONOCHROME are currently not implemented.392 * LR_MONOCHROME should be implemented by CURSORICON_CreateFromResource.393 * LR_COPYFROMRESOURCE will only work if the Image is in the Cache.394 *395 *396 * TODO: LR_COPYFROMRESOURCE doesn't work. Uses supplied icon instead397 *398 */399 HGLOBAL CopyCursorIcon(HGLOBAL Handle, UINT nType,400 INT iDesiredCX, INT iDesiredCY,401 UINT nFlags)402 {403 HGLOBAL hNew=0;404 BOOL bIsIcon = (nType == IMAGE_ICON);405 406 if(Handle == 0)407 {408 return 0;409 }410 411 /* Best Fit or Monochrome */412 if(!bIsIcon || (nFlags & LR_COPYFROMRESOURCE413 && (iDesiredCX > 0 || iDesiredCY > 0))414 || nFlags & LR_MONOCHROME)415 {416 LPBYTE pBits;417 HANDLE hMem;418 HRSRC hRsrc;419 DWORD dwBytesInRes;420 WORD wResId;421 CURSORICONDIR *pDir;422 CURSORICONDIRENTRY *pDirEntry;423 424 /* Completing iDesiredCX CY for Monochrome Bitmaps if needed425 */426 if(((nFlags & LR_MONOCHROME) && !(nFlags & LR_COPYFROMRESOURCE))427 || (iDesiredCX == 0 && iDesiredCY == 0))428 {429 iDesiredCY = GetSystemMetrics(bIsIcon ?430 SM_CYICON : SM_CYCURSOR);431 iDesiredCX = GetSystemMetrics(bIsIcon ?432 SM_CXICON : SM_CXCURSOR);433 }434 435 /* Create a New Icon with the proper dimension436 */437 ICONINFO iconinfo;438 439 GetIconInfo(Handle, &iconinfo);440 hNew = CreateIconIndirect(&iconinfo, bIsIcon, iDesiredCX, iDesiredCY, nFlags);441 }442 else443 {444 if(bIsIcon) {445 return CopyIcon(Handle);446 }447 else return CopyCursor(Handle);448 }449 return hNew;450 }451 964 //****************************************************************************** 452 965 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.