[Scummvm-cvs-logs] SF.net SVN: scummvm:[40110] scummvm/trunk/engines/sci

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Fri Apr 24 14:30:58 CEST 2009


Revision: 40110
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40110&view=rev
Author:   waltervn
Date:     2009-04-24 12:30:57 +0000 (Fri, 24 Apr 2009)

Log Message:
-----------
SCI: Fixed mouse cursor hotspots in ECO1.

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/gfx/gfx_driver.cpp
    scummvm/trunk/engines/sci/gfx/gfx_driver.h
    scummvm/trunk/engines/sci/gfx/operations.cpp
    scummvm/trunk/engines/sci/scicore/vocab_debug.cpp

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-04-24 11:54:10 UTC (rev 40109)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-04-24 12:30:57 UTC (rev 40110)
@@ -315,8 +315,7 @@
 		break;
 	}
 	case 3 : {
-		Common::Point hotspot = Common::Point(0, 0);
-		GFX_ASSERT(gfxop_set_pointer_view(s->gfx_state, UKPV(0), UKPV(1), UKPV(2), &hotspot));
+		GFX_ASSERT(gfxop_set_pointer_view(s->gfx_state, UKPV(0), UKPV(1), UKPV(2), NULL));
 		s->mouse_pointer_view = UKPV(0);
 		s->mouse_pointer_loop = UKPV(1);
 		s->mouse_pointer_cel = UKPV(2);

Modified: scummvm/trunk/engines/sci/gfx/gfx_driver.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_driver.cpp	2009-04-24 11:54:10 UTC (rev 40109)
+++ scummvm/trunk/engines/sci/gfx/gfx_driver.cpp	2009-04-24 12:30:57 UTC (rev 40110)
@@ -286,13 +286,13 @@
 }
 
 
-static int scummvm_set_pointer(gfx_driver_t *drv, gfx_pixmap_t *pointer) {
-	if (pointer == NULL) {
+static int scummvm_set_pointer(gfx_driver_t *drv, gfx_pixmap_t *pointer, Common::Point *hotspot) {
+	if ((pointer == NULL) || (hotspot == NULL)) {
 		g_system->showMouse(false);
 	} else {
 		delete[] S->pointer_data;
 		S->pointer_data = create_cursor(drv, pointer, 1);
-		g_system->setMouseCursor(S->pointer_data, pointer->width, pointer->height, pointer->xoffset, pointer->yoffset);
+		g_system->setMouseCursor(S->pointer_data, pointer->width, pointer->height, hotspot->x, hotspot->y);
 		g_system->showMouse(true);
 	}
 

Modified: scummvm/trunk/engines/sci/gfx/gfx_driver.h
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_driver.h	2009-04-24 11:54:10 UTC (rev 40109)
+++ scummvm/trunk/engines/sci/gfx/gfx_driver.h	2009-04-24 12:30:57 UTC (rev 40110)
@@ -251,11 +251,13 @@
 
 	/*** Mouse pointer operations ***/
 
-	int (*set_pointer)(gfx_driver_t *drv, gfx_pixmap_t *pointer);
+	int (*set_pointer)(gfx_driver_t *drv, gfx_pixmap_t *pointer, Common::Point *hotspot);
 	/* Sets a new mouse pointer.
 	** Parameters: (gfx_driver_t *) drv: The driver to modify
 	**             (gfx_pixmap_t *) pointer: The pointer to set, or NULL to set
 	**                              no pointer
+	**             (Common::Point *) hotspot: The coordinates of the hotspot,
+	**                               or NULL to set no pointer
 	** Returns   : (int) GFX_OK or GFX_FATAL
 	** If pointer is not NULL, it will have been scaled to the appropriate
 	** size and registered as a pixmap (if neccessary) beforehand.

Modified: scummvm/trunk/engines/sci/gfx/operations.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/operations.cpp	2009-04-24 11:54:10 UTC (rev 40109)
+++ scummvm/trunk/engines/sci/gfx/operations.cpp	2009-04-24 12:30:57 UTC (rev 40110)
@@ -1185,33 +1185,32 @@
 	return GFX_OK;
 }
 
-int _gfxop_set_pointer(gfx_state_t *state, gfx_pixmap_t *pxm) {
+static int _gfxop_set_pointer(gfx_state_t *state, gfx_pixmap_t *pxm, Common::Point *hotspot) {
 	BASIC_CHECKS(GFX_FATAL);
 
-	state->driver->set_pointer(state->driver, pxm);
+	state->driver->set_pointer(state->driver, pxm, hotspot);
 
 	return GFX_OK;
 }
 
 int gfxop_set_pointer_cursor(gfx_state_t *state, int nr) {
-	gfx_pixmap_t *new_pointer = NULL;
-
 	BASIC_CHECKS(GFX_FATAL);
 
 	if (nr == GFXOP_NO_POINTER)
-		new_pointer = NULL;
-	else {
-		new_pointer = state->gfxResMan->getCursor(nr);
+		return _gfxop_set_pointer(state, NULL, NULL);
 
-		if (!new_pointer) {
-			GFXWARN("Attempt to set invalid pointer #%d\n", nr);
-		}
+	gfx_pixmap_t *new_pointer = state->gfxResMan->getCursor(nr);
+
+	if (!new_pointer) {
+		GFXWARN("Attempt to set invalid pointer #%d\n", nr);
+		return GFX_ERROR;
 	}
 
-	return _gfxop_set_pointer(state, new_pointer);
+	Common::Point p = Common::Point(new_pointer->xoffset, new_pointer->yoffset);
+	return _gfxop_set_pointer(state, new_pointer, &p);
 }
 
-int gfxop_set_pointer_view(gfx_state_t *state, int nr, int loop, int cel, Common::Point  *hotspot) {
+int gfxop_set_pointer_view(gfx_state_t *state, int nr, int loop, int cel, Common::Point *hotspot) {
 	int real_loop = loop;
 	int real_cel = cel;
 	gfx_pixmap_t *new_pointer = NULL;
@@ -1220,24 +1219,25 @@
 
 	new_pointer = _gfxr_get_cel(state, nr, &real_loop, &real_cel, 0); // FIXME: For now, don't palettize pointers
 
-	if (hotspot) {
-		new_pointer->xoffset = hotspot->x;
-		new_pointer->yoffset = hotspot->y;
+	if (!new_pointer) {
+		GFXWARN("Attempt to set invalid pointer #%d\n", nr);
+		return GFX_ERROR;
 	}
 
-	// Special case for Eco Quest 1: The game is trying to hide the mouse cursor by clipping it, which is rejected
-	// by our graphics scaler. Hide the cursor when that happens instead.
+	if (real_loop != loop || real_cel != cel) {
+		GFXDEBUG("Changed loop/cel from %d/%d to %d/%d in view %d\n", loop, cel, real_loop, real_cel, nr);
+	}
+
+	// Eco Quest 1 uses a 1x1 transparent cursor to hide the cursor from the user. Some scalers don't seem to support this.
 	if (new_pointer->width < 2 || new_pointer->height < 2)
-		return _gfxop_set_pointer(state, NULL);
+		return _gfxop_set_pointer(state, NULL, NULL);
 
-	if (!new_pointer) {
-		GFXWARN("Attempt to set invalid pointer #%d\n", nr);
-		return GFX_ERROR;
-	} else {
-		if (real_loop != loop || real_cel != cel) {
-			GFXDEBUG("Changed loop/cel from %d/%d to %d/%d in view %d\n", loop, cel, real_loop, real_cel, nr);
-		}
-		return _gfxop_set_pointer(state, new_pointer);
+	if (hotspot)
+		return _gfxop_set_pointer(state, new_pointer, hotspot);
+	else {
+		// Compute hotspot from xoffset/yoffset
+		Common::Point p = Common::Point(new_pointer->xoffset + (new_pointer->width >> 1), new_pointer->yoffset + new_pointer->height - 1);
+		return _gfxop_set_pointer(state, new_pointer, &p);
 	}
 }
 

Modified: scummvm/trunk/engines/sci/scicore/vocab_debug.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/vocab_debug.cpp	2009-04-24 11:54:10 UTC (rev 40109)
+++ scummvm/trunk/engines/sci/scicore/vocab_debug.cpp	2009-04-24 12:30:57 UTC (rev 40110)
@@ -233,7 +233,7 @@
 	/*0x4e*/ "OnControl",
 	/*0x4f*/ "InitBresen",
 	/*0x50*/ "DoBresen",
-	/*0x51*/ "DoAvoider",
+	/*0x51*/ SCRIPT_UNKNOWN_FUNCTION_STRING, // DoAvoider is not implemented in SCI1
 	/*0x52*/ "SetJump",
 	/*0x53*/ "SetDebug",
 	/*0x54*/ "InspectObj",


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list