Changeset 5385 for trunk/src/user32/oslibres.cpp
- Timestamp:
- Mar 27, 2001, 6:17:52 PM (24 years ago)
- File:
-
- 1 edited
-
trunk/src/user32/oslibres.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/oslibres.cpp
r4573 r5385 1 /* $Id: oslibres.cpp,v 1.1 1 2000-11-09 18:15:18sandervl Exp $ */1 /* $Id: oslibres.cpp,v 1.12 2001-03-27 16:17:52 sandervl Exp $ */ 2 2 /* 3 3 * Window API wrappers for OS/2 … … 22 22 #include "oslibmsg.h" 23 23 #include "oslibgdi.h" 24 #include "oslibres.h" 24 25 #include "pmwindow.h" 25 26 … … 228 229 } 229 230 //****************************************************************************** 231 //NOTE: Depends on origin of bitmap data!!! 232 // Assumes 1 bpp bitmaps have a top left origin and all others have a bottom left origin 233 //****************************************************************************** 234 HANDLE OSLibWinCreateCursor(CURSORICONINFO *pInfo, char *pAndBits, BITMAP_W *pAndBmp, char *pXorBits, BITMAP_W *pXorBmp) 235 { 236 POINTERINFO pointerInfo = {0}; 237 HANDLE hPointer; 238 HBITMAP hbmColor = 0, hbmMask = 0; 239 BITMAPINFO2 *pBmpColor, *pBmpMask; 240 int masksize, colorsize, rgbsize, i; 241 HPS hps; 242 char *dest, *src; 243 244 hps = WinGetScreenPS(HWND_DESKTOP); 245 masksize = sizeof(BITMAPINFO2) + (pAndBmp->bmHeight * 2 * pAndBmp->bmWidthBytes) + 2*sizeof(RGB2); 246 pBmpMask = (BITMAPINFO2 *)malloc(masksize); 247 if(pBmpMask == NULL) { 248 DebugInt3(); 249 return 0; 250 } 251 memset(pBmpMask, 0, masksize); 252 pBmpMask->cbFix = sizeof(BITMAPINFOHEADER2); 253 pBmpMask->cx = (USHORT)pAndBmp->bmWidth; 254 pBmpMask->cy = (USHORT)pAndBmp->bmHeight*2; 255 pBmpMask->cPlanes = pAndBmp->bmPlanes; 256 pBmpMask->cBitCount = 1; 257 pBmpMask->ulCompression = BCA_UNCOMP; 258 pBmpMask->ulColorEncoding = BCE_RGB; 259 memset(&pBmpMask->argbColor[0], 0, sizeof(RGB2)); 260 memset(&pBmpMask->argbColor[1], 0xff, sizeof(RGB)); //not the reserved byte 261 //Xor bits are already 0 262 //copy And bits (must reverse scanlines because origin is top left instead of bottom left) 263 src = pAndBits; 264 dest = ((char *)&pBmpMask->argbColor[2]) + (pAndBmp->bmHeight * 2 - 1) * (pAndBmp->bmWidthBytes); 265 for(i=0;i<pAndBmp->bmHeight;i++) { 266 memcpy(dest, src, pAndBmp->bmWidthBytes); 267 dest -= pAndBmp->bmWidthBytes; 268 src += pAndBmp->bmWidthBytes; 269 } 270 hbmMask = GpiCreateBitmap(hps, (BITMAPINFOHEADER2 *)pBmpMask, CBM_INIT, 271 (PBYTE)&pBmpMask->argbColor[2], pBmpMask); 272 273 if(hbmMask == GPI_ERROR) { 274 dprintf(("OSLibWinCreatePointer: GpiCreateBitmap failed!")); 275 WinReleasePS(hps); 276 free(pBmpMask); 277 return 0; 278 } 279 if(pXorBits) 280 {//color bitmap present 281 RGBQUAD *rgb; 282 RGB2 *os2rgb; 283 284 if(pXorBmp->bmBitsPixel <= 8) 285 rgbsize = (1<<pXorBmp->bmBitsPixel)*sizeof(RGB2); 286 else rgbsize = 0; 287 288 colorsize = sizeof(BITMAPINFO2) + (pXorBmp->bmHeight * pXorBmp->bmWidthBytes) + rgbsize; 289 pBmpColor = (BITMAPINFO2 *)malloc(colorsize); 290 if(pBmpColor == NULL) { 291 DebugInt3(); 292 return 0; 293 } 294 memset(pBmpColor, 0, colorsize); 295 pBmpColor->cbFix = sizeof(BITMAPINFOHEADER2); 296 pBmpColor->cx = (USHORT)pXorBmp->bmWidth; 297 pBmpColor->cy = (USHORT)pXorBmp->bmHeight; 298 pBmpColor->cPlanes = pXorBmp->bmPlanes; 299 pBmpColor->cBitCount = pXorBmp->bmBitsPixel; 300 pBmpColor->ulCompression = BCA_UNCOMP; 301 pBmpColor->ulColorEncoding = BCE_RGB; 302 303 os2rgb = &pBmpColor->argbColor[0]; 304 rgb = (RGBQUAD *)(pXorBits); 305 306 if(pXorBmp->bmBitsPixel <= 8) { 307 for(i=0;i<(1<<pXorBmp->bmBitsPixel);i++) { 308 os2rgb->bRed = rgb->rgbRed; 309 os2rgb->bBlue = rgb->rgbBlue; 310 os2rgb->bGreen = rgb->rgbGreen; 311 os2rgb++; 312 rgb++; 313 } 314 } 315 316 if(pXorBmp->bmBitsPixel == 1) { 317 //copy Xor bits (must reverse scanlines because origin is top left instead of bottom left) 318 src = (char *)rgb; 319 dest = ((char *)os2rgb) + (pXorBmp->bmHeight - 1) * pXorBmp->bmWidthBytes; 320 for(i=0;i<pXorBmp->bmHeight;i++) { 321 memcpy(dest, src, pXorBmp->bmWidthBytes); 322 dest -= pXorBmp->bmWidthBytes; 323 src += pXorBmp->bmWidthBytes; 324 } 325 } 326 else memcpy(os2rgb, rgb, pXorBmp->bmHeight * pXorBmp->bmWidthBytes); 327 328 hbmColor = GpiCreateBitmap(hps, (BITMAPINFOHEADER2 *)pBmpColor, CBM_INIT, 329 (PBYTE)os2rgb, pBmpColor); 330 331 if(hbmColor == GPI_ERROR) { 332 dprintf(("OSLibWinCreateIcon: GpiCreateBitmap failed!")); 333 GpiDeleteBitmap(hbmMask); 334 WinReleasePS(hps); 335 free(pBmpMask); 336 return 0; 337 } 338 } 339 340 pointerInfo.fPointer = TRUE; 341 pointerInfo.xHotspot = pInfo->ptHotSpot.x; 342 pointerInfo.yHotspot = mapY(pInfo->nHeight, pInfo->ptHotSpot.y); 343 pointerInfo.hbmColor = hbmColor; 344 pointerInfo.hbmPointer = hbmMask; 345 hPointer = WinCreatePointerIndirect(HWND_DESKTOP, &pointerInfo); 346 347 if(hPointer == NULL) { 348 dprintf(("OSLibWinCreateCursor: WinCreatePointerIndirect failed! (lasterr=%x)", WinGetLastError(GetThreadHAB()))); 349 } 350 GpiDeleteBitmap(hbmMask); 351 if(hbmColor) GpiDeleteBitmap(hbmColor); 352 WinReleasePS(hps); 353 354 free(pBmpMask); 355 free(pBmpColor); 356 return hPointer; 357 } 358 //****************************************************************************** 230 359 //****************************************************************************** 231 360 HANDLE OSLibWinQuerySysIcon(ULONG type,INT w,INT h) … … 332 461 //****************************************************************************** 333 462 //****************************************************************************** 463 VOID OSLibWinDestroyPointer(HANDLE hPointer) 464 { 465 WinDestroyPointer(hPointer); 466 } 467 //****************************************************************************** 468 //****************************************************************************** 469 BOOL OSLibWinSetPointer(HANDLE hPointer) 470 { 471 return WinSetPointer(HWND_DESKTOP, hPointer); 472 } 473 //****************************************************************************** 474 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.
