| 357 | } |
| 358 | |
| 359 | void Sprites_SetMouseSprite(uint16 hotSpotX, uint16 hotSpotY, const uint8 *sprite) |
| 360 | { |
| 361 | uint16 size; |
| 362 | |
| 363 | if (sprite == NULL || g_mouseDisabled != 0) return; |
| 364 | |
| 365 | while (g_mouseLock != 0) sleepIdle(); |
| 366 | |
| 367 | g_mouseLock++; |
| 368 | |
| 369 | GUI_Mouse_Hide(); |
| 370 | |
| 371 | size = GFX_GetSize(READ_LE_UINT16(sprite + 3) + 16, sprite[5]); |
| 372 | |
| 373 | if (s_mouseSpriteBufferSize < size) { |
| 374 | g_mouseSpriteBuffer = realloc(g_mouseSpriteBuffer, size); |
| 375 | s_mouseSpriteBufferSize = size; |
| 376 | } |
| 377 | |
| 378 | size = READ_LE_UINT16(sprite + 8) + 10; |
| 379 | if ((*sprite & 0x1) != 0) size += 16; |
| 380 | |
| 381 | if (s_mouseSpriteSize < size) { |
| 382 | g_mouseSprite = realloc(g_mouseSprite, size); |
| 383 | s_mouseSpriteSize = size; |
| 384 | } |
| 385 | |
| 386 | if ((*sprite & 0x2) != 0) { |
| 387 | memcpy(g_mouseSprite, sprite, READ_LE_UINT16(sprite + 6)); |
| 388 | } else { |
| 389 | uint8 *dst = (uint8 *)g_mouseSprite; |
| 390 | uint8 flags = sprite[0] | 0x2; |
| 391 | |
| 392 | dst[0] = flags; |
| 393 | dst[1] = sprite[1]; |
| 394 | dst += 2; |
| 395 | sprite += 2; |
| 396 | |
| 397 | memcpy(dst, sprite, 6); |
| 398 | dst += 6; |
| 399 | sprite += 6; |
| 400 | |
| 401 | size = READ_LE_UINT16(sprite); |
| 402 | dst[0] = sprite[0]; |
| 403 | dst[1] = sprite[1]; |
| 404 | dst += 2; |
| 405 | sprite += 2; |
| 406 | |
| 407 | if ((flags & 0x1) != 0) { |
| 408 | memcpy(dst, sprite, 16); |
| 409 | dst += 16; |
| 410 | sprite += 16; |
| 411 | } |
| 412 | |
| 413 | Format80_Decode(dst, sprite, size); |
| 414 | } |
| 415 | |
| 416 | g_mouseSpriteHotspotX = hotSpotX; |
no test coverage detected