diff options
author | Torbjörn Andersson | 2003-08-20 06:35:15 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2003-08-20 06:35:15 +0000 |
commit | d0faf4c225ffdcc8e661057b3ebd70ddf0ef3876 (patch) | |
tree | 1d971767ee092276f727d21a49d93c8782d257a6 /sword2/driver/_mouse.cpp | |
parent | 050241ff87213d18f393cffb734ce102f09b37fe (diff) | |
download | scummvm-rg350-d0faf4c225ffdcc8e661057b3ebd70ddf0ef3876.tar.gz scummvm-rg350-d0faf4c225ffdcc8e661057b3ebd70ddf0ef3876.tar.bz2 scummvm-rg350-d0faf4c225ffdcc8e661057b3ebd70ddf0ef3876.zip |
This should fix mouse cursor animations. (Actually, I hardly even looked at
what the old mouse cursor patch did. I simply replaced it with my own.
Sorry about that. :-)
svn-id: r9786
Diffstat (limited to 'sword2/driver/_mouse.cpp')
-rw-r--r-- | sword2/driver/_mouse.cpp | 436 |
1 files changed, 67 insertions, 369 deletions
diff --git a/sword2/driver/_mouse.cpp b/sword2/driver/_mouse.cpp index b8d4b95e84..5ab8da22b9 100644 --- a/sword2/driver/_mouse.cpp +++ b/sword2/driver/_mouse.cpp @@ -140,13 +140,12 @@ #include "../sword2.h" - #define MAX_MOUSE_EVENTS 16 #define MOUSEFLASHFRAME 6 +// FIXME: Does this struct have to be packed? -typedef struct -{ +typedef struct { uint8 runTimeComp; // type of runtime compression used for the frame data uint8 noAnimFrames; // number of frames in the anim int8 xHotSpot; @@ -155,34 +154,28 @@ typedef struct uint8 mouseh; } _mouseAnim; - int16 mousex; int16 mousey; static uint8 mouseBacklog = 0; static uint8 mouseLogPos = 0; static uint8 mouseFrame; -//static uint8 luggageFrame = 0; static uint8 *mouseSprite = NULL; static _mouseAnim *mouseAnim = NULL; -//static _mouseAnim *luggageAnim = NULL; +static _mouseAnim *luggageAnim = NULL; static _mouseEvent mouseLog[MAX_MOUSE_EVENTS]; static int32 *mouseOffsets; -//static int32 *luggageOffset; -//static LPDIRECTDRAWSURFACE *mouseSurfaces; -//static LPDIRECTDRAWSURFACE luggageSurface = NULL; +static int32 *luggageOffset; +// FIXME: I have no idea how large the mouse cursor can be. Is this enough? +byte _mouseData[128 * 128]; -void ResetRenderEngine(void) - -{ - - memset(myScreenBuffer, 0, RENDERWIDE * RENDERDEEP); +void ResetRenderEngine(void) { parallaxScrollx = 0; parallaxScrolly = 0; scrollx = 0; @@ -218,269 +211,35 @@ void LogMouseEvent(uint16 buttons) +// FIXME: The original code used 0 for transparency, while our backend uses +// 0xFF. That means that parts of the mouse cursor that weren't meant to be +// transparent may be now. - - -int32 DecompressMouse(uint8 *decomp, uint8 *comp, int32 size) - -{ - +int32 DecompressMouse(uint8 *decomp, uint8 *comp, int32 size) { int32 i = 0; - while (i < size) - { - if (*comp > 183) - { + while (i < size) { + if (*comp > 183) { *decomp++ = *comp++; - i += 1; - } - else - { - memset(decomp, 0, *comp); + i++; + } else { + memset(decomp, 0xFF, *comp); decomp += *comp; i += *comp++; } } - return(RD_OK); + return RD_OK; } -// -------------------------------------------------------------------------- -// Draws the mouse sprite to the back buffer. -// -------------------------------------------------------------------------- -int32 DrawMouse(void) - -{ - warning("stub DrawMouse"); -/* - uint8 *src, *dst; - int16 i; - int16 xoff=0, yoff=0; - uint8 *decompSprite; - DDSURFACEDESC ddsd; - HRESULT hr; - RECT rs, rd; - - - - if (luggageAnim) - { - - if (luggageSurface == NULL) - { - // Create the luggage surface. - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - if (dxHalCaps & RDCAPS_SRCBLTCKEY) - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - else - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - - ddsd.dwWidth = luggageAnim->mousew; - ddsd.dwHeight = luggageAnim->mouseh; - hr = IDirectDraw2_CreateSurface(lpDD2, &ddsd, &luggageSurface, NULL); - if (hr != DD_OK) - { - if (hr == DDERR_OUTOFVIDEOMEMORY) - { - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; - hr = IDirectDraw2_CreateSurface(lpDD2, &ddsd, &luggageSurface, NULL); - } - if (hr != DD_OK) - { - DirectDrawError("Cannot create mouse surface", hr); - return(hr); - } - } - // Set the surface blt source colour key - hr = IDirectDrawSurface2_SetColorKey(luggageSurface, DDCKEY_SRCBLT, &blackColorKey); - - // Copy the data into the surfaces. - decompSprite = (uint8 *) malloc(luggageAnim->mousew * luggageAnim->mouseh); - if (decompSprite == NULL) - return(RDERR_OUTOFMEMORY); -// DecompressMouse(decompSprite, (uint8 *) luggageAnim + *mouseOffsets, luggageAnim->mousew * luggageAnim->mouseh); - DecompressMouse(decompSprite, (uint8 *) luggageAnim + *luggageOffset, luggageAnim->mousew * luggageAnim->mouseh); - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - hr = IDirectDrawSurface2_Lock(luggageSurface, NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (hr != DD_OK) - { - IDirectDrawSurface2_Restore(luggageSurface); - hr = IDirectDrawSurface2_Lock(luggageSurface, NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (hr != DD_OK) - { - DirectDrawError("Unable to lock luggage surface", hr); - return(hr); - } - } - dst = ddsd.lpSurface; - src = decompSprite; - for (i=0; i<luggageAnim->mouseh; i++) - { - memcpy(dst, src, luggageAnim->mousew); - dst += ddsd.lPitch; - src += luggageAnim->mousew; - } - IDirectDrawSurface2_Unlock(luggageSurface, ddsd.lpSurface); - free(decompSprite); - } - - - rd.top = mousey + MENUDEEP - luggageAnim->yHotSpot; - rd.bottom = rd.top + luggageAnim->mouseh; - rd.left = mousex - luggageAnim->xHotSpot; - rd.right = rd.left + luggageAnim->mousew; - - rs.left = 0; - rs.right = luggageAnim->mousew; - rs.top = 0; - rs.bottom = luggageAnim->mouseh; - - if (rd.left < 0) - { - rs.left = 0 - rd.left; - rd.left = 0; - } - if (rd.top < 0) - { - rs.top = 0 - rd.top; - rd.top = 0; - } - if (rd.right > RENDERWIDE) - { - rs.right -= (rd.right - RENDERWIDE); - rd.right = RENDERWIDE; - } - if (rd.bottom > ALIGNRENDERDEEP) - { - rs.bottom -= (rd.bottom - ALIGNRENDERDEEP); - rd.bottom = ALIGNRENDERDEEP; - } - - hr = IDirectDrawSurface2_Blt(lpBackBuffer, &rd, luggageSurface, &rs, DDBLT_WAIT | DDBLT_KEYSRC, NULL); - if (hr = DDERR_SURFACELOST) - { - IDirectDrawSurface2_Release(luggageSurface); - luggageSurface = NULL; - } - - } - - if (mouseAnim == NULL) - { - return(RD_OK); - } - - - // Decompress the mouse sprite onto the directDraw surface, if it is not - // there already. - if (*(mouseSurfaces + mouseFrame) == NULL) - { - - // Create the mouse surface. - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - if (dxHalCaps & RDCAPS_SRCBLTCKEY) - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - else - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - - ddsd.dwWidth = mouseAnim->mousew; - ddsd.dwHeight = mouseAnim->mouseh; - hr = IDirectDraw2_CreateSurface(lpDD2, &ddsd, mouseSurfaces + mouseFrame, NULL); - if (hr != DD_OK) - { - if (hr == DDERR_OUTOFVIDEOMEMORY) - { - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; - hr = IDirectDraw2_CreateSurface(lpDD2, &ddsd, mouseSurfaces + mouseFrame, NULL); - } - if (hr != DD_OK) - { - DirectDrawError("Cannot create mouse surface", hr); - return(hr); - } - } - // Set the surface blt source colour key - hr = IDirectDrawSurface2_SetColorKey(*(mouseSurfaces + mouseFrame), DDCKEY_SRCBLT, &blackColorKey); - - // Copy the data into the surfaces. - decompSprite = (uint8 *) malloc(mouseAnim->mousew * mouseAnim->mouseh); - if (decompSprite == NULL) - return(RDERR_OUTOFMEMORY); - DecompressMouse(decompSprite, mouseSprite, mouseAnim->mousew * mouseAnim->mouseh); - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - hr = IDirectDrawSurface2_Lock(*(mouseSurfaces + mouseFrame), NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (hr != DD_OK) - { - IDirectDrawSurface2_Restore(*(mouseSurfaces + mouseFrame)); - hr = IDirectDrawSurface2_Lock(*(mouseSurfaces + mouseFrame), NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (hr != DD_OK) - { - DirectDrawError("Cannot lock mouse surface", hr); - return(hr); - } - } - dst = ddsd.lpSurface; - src = decompSprite; - for (i=0; i<mouseAnim->mouseh; i++) - { - memcpy(dst, src, mouseAnim->mousew); - dst += ddsd.lPitch; - src += mouseAnim->mousew; - } - IDirectDrawSurface2_Unlock(*(mouseSurfaces + mouseFrame), ddsd.lpSurface); - free(decompSprite); - } - - - rd.top = mousey + MENUDEEP - mouseAnim->yHotSpot; - rd.bottom = rd.top + mouseAnim->mouseh; - rd.left = mousex - mouseAnim->xHotSpot; - rd.right = rd.left + mouseAnim->mousew; - - rs.left = 0; - rs.right = mouseAnim->mousew; - rs.top = 0; - rs.bottom = mouseAnim->mouseh; - - if (rd.left < 0) - { - rs.left = 0 - rd.left; - rd.left = 0; +int32 DrawMouse(void) { + if (mouseAnim) { + memset(_mouseData, 0, sizeof(_mouseData)); + DecompressMouse(_mouseData, mouseSprite, mouseAnim->mousew * mouseAnim->mouseh); + g_sword2->_system->set_mouse_cursor(_mouseData, mouseAnim->mousew, mouseAnim->mouseh, mouseAnim->xHotSpot, mouseAnim->yHotSpot); } - if (rd.top < 0) - { - rs.top = 0 - rd.top; - rd.top = 0; - } - if (rd.right > RENDERWIDE) - { - rs.right -= (rd.right - RENDERWIDE); - rd.right = RENDERWIDE; - } - if (rd.bottom > ALIGNRENDERDEEP) - { - rs.bottom -= (rd.bottom - ALIGNRENDERDEEP); - rd.bottom = ALIGNRENDERDEEP; - } - - hr = IDirectDrawSurface2_Blt(lpBackBuffer, &rd, *(mouseSurfaces + mouseFrame), &rs, DDBLT_WAIT | DDBLT_KEYSRC, NULL); - if (hr == DDERR_SURFACELOST) - { - IDirectDrawSurface2_Release(*(mouseSurfaces + mouseFrame)); - *(mouseSurfaces + mouseFrame) = NULL; - } -*/ - return(RD_OK); - + return RD_OK; } @@ -512,137 +271,76 @@ uint8 CheckForMouseEvents(void) // (James23july97) } -int32 AnimateMouse(void) +int32 AnimateMouse(void) { + uint8 prevMouseFrame = mouseFrame; -{ - if (mouseAnim) - { - if (++mouseFrame == mouseAnim->noAnimFrames) - { - mouseFrame = MOUSEFLASHFRAME; - } - mouseSprite = (uint8 *) mouseAnim + *(mouseOffsets+mouseFrame); - } - else - { - return(RDERR_UNKNOWN); - } - - return(RD_OK); + if (!mouseAnim) + return RDERR_UNKNOWN; -} + if (++mouseFrame == mouseAnim->noAnimFrames) + mouseFrame = MOUSEFLASHFRAME; + mouseSprite = (uint8 *) mouseAnim + *(mouseOffsets + mouseFrame); + + if (mouseFrame != prevMouseFrame) + DrawMouse(); + return RD_OK; +} -int32 SetMouseAnim(uint8 *ma, int32 size, int32 mouseFlash) -{ - if (ma) { - if (mouseAnim) - free(mouseAnim); +int32 SetMouseAnim(uint8 *ma, int32 size, int32 mouseFlash) { + if (mouseAnim) { + free(mouseAnim); + mouseAnim = NULL; + } + if (ma) { if (mouseFlash == RDMOUSE_FLASH) mouseFrame = 0; else mouseFrame = MOUSEFLASHFRAME; + mouseAnim = (_mouseAnim *) malloc(size); + if (!mouseAnim) + return RDERR_OUTOFMEMORY; - mouseAnim = (_mouseAnim *)malloc(size); - memcpy((uint8 *)mouseAnim, ma, size); - - mouseOffsets = (int32 *)((uint8 *)mouseAnim + sizeof(_mouseAnim)); + memcpy((uint8 *) mouseAnim, ma, size); + mouseOffsets = (int32 *) ((uint8 *) mouseAnim + sizeof(_mouseAnim)); AnimateMouse(); + DrawMouse(); - uint8 *decompSprite = (uint8 *)malloc(mouseAnim->mousew * mouseAnim->mouseh); - DecompressMouse(decompSprite, mouseSprite, mouseAnim->mousew * mouseAnim->mouseh); - - int i; - for (i = 0; i < mouseAnim->mousew * mouseAnim->mouseh; i++) - if (decompSprite[i] == 0) - decompSprite[i] = 0xff; - - g_sword2->_system->set_mouse_cursor(decompSprite, - mouseAnim->mousew, mouseAnim->mouseh, - mouseAnim->xHotSpot, mouseAnim->yHotSpot - MENUDEEP); g_sword2->_system->show_mouse(true); } else g_sword2->_system->show_mouse(false); + return RD_OK; +} -/* - int32 i; - - if (mouseAnim) - { - for (i=0; i<mouseAnim->noAnimFrames; i++) - { - if (*(mouseSurfaces + i)) - { - IDirectDrawSurface2_Release(*(mouseSurfaces + i)); - *(mouseSurfaces + i) = NULL; - } - } - free(mouseAnim); - mouseAnim = NULL; - free(mouseSurfaces); - mouseSurfaces = NULL; +int32 SetLuggageAnim(uint8 *ma, int32 size) { + if (luggageAnim) { + free(luggageAnim); + luggageAnim = NULL; } - - if (ma) - { - if (mouseFlash == RDMOUSE_FLASH) - mouseFrame = 0; - else - mouseFrame = MOUSEFLASHFRAME; - mouseAnim = malloc(size); - if (mouseAnim == NULL) - { + if (ma) { + luggageAnim = (_mouseAnim *) malloc(size); + if (!luggageAnim) return(RDERR_OUTOFMEMORY); - } - else - { - memcpy((uint8 *) mouseAnim, ma, size); - mouseOffsets = (int32 *) ((uint8 *) mouseAnim + sizeof(_mouseAnim)); - AnimateMouse(); - mouseSurfaces = (LPDIRECTDRAWSURFACE *) malloc(mouseAnim->noAnimFrames * sizeof(LPDIRECTDRAWSURFACE)); - if (mouseSurfaces == NULL) - return(RDERR_OUTOFMEMORY); - memset(mouseSurfaces, 0, sizeof(LPDIRECTDRAWSURFACE) * mouseAnim->noAnimFrames); - } - } -*/ - return(RD_OK); -} + memcpy((uint8 *) luggageAnim, ma, size); + luggageOffset = (int32 *) ((uint8 *) luggageAnim + sizeof(_mouseAnim)); + // The luggage animation is only one frame. -int32 SetLuggageAnim(uint8 *ma, int32 size) + memset(_mouseData, 0, sizeof(_mouseData)); -{ - warning("stub SetLugggeAnim"); -/* - - if (luggageAnim) - { - free(luggageAnim); - luggageAnim = NULL; - } + DecompressMouse(_mouseData, (uint8 *) luggageAnim + *mouseOffsets, luggageAnim->mousew * luggageAnim->mouseh); + DecompressMouse(_mouseData, (uint8 *) luggageAnim + *luggageOffset, luggageAnim->mousew * luggageAnim->mouseh); - if (ma) - { - luggageAnim = malloc(size); - if (luggageAnim == NULL) - { - return(RDERR_OUTOFMEMORY); - } - else - { - memcpy((uint8 *) luggageAnim, ma, size); - luggageOffset = (int32 *) ((uint8 *) luggageAnim + sizeof(_mouseAnim)); - AnimateMouse(); - } - } -*/ - return(RD_OK); + g_sword2->_system->set_mouse_cursor(_mouseData, luggageAnim->mousew, luggageAnim->mouseh, luggageAnim->xHotSpot, luggageAnim->yHotSpot); + g_sword2->_system->show_mouse(true); + } else + g_sword2->_system->show_mouse(false); + return RD_OK; } |