aboutsummaryrefslogtreecommitdiff
path: root/sword2/driver/_mouse.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2003-08-20 06:35:15 +0000
committerTorbjörn Andersson2003-08-20 06:35:15 +0000
commitd0faf4c225ffdcc8e661057b3ebd70ddf0ef3876 (patch)
tree1d971767ee092276f727d21a49d93c8782d257a6 /sword2/driver/_mouse.cpp
parent050241ff87213d18f393cffb734ce102f09b37fe (diff)
downloadscummvm-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.cpp436
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;
}