[Scummvm-cvs-logs] SF.net SVN: scummvm:[38820] scummvm/trunk/engines/sci/gfx/gfx_driver.cpp

wjpalenstijn at users.sourceforge.net wjpalenstijn at users.sourceforge.net
Mon Feb 23 23:36:19 CET 2009


Revision: 38820
          http://scummvm.svn.sourceforge.net/scummvm/?rev=38820&view=rev
Author:   wjpalenstijn
Date:     2009-02-23 22:36:19 +0000 (Mon, 23 Feb 2009)

Log Message:
-----------
SCI: reinstate pointer scaling for xfact/yfact

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gfx/gfx_driver.cpp

Modified: scummvm/trunk/engines/sci/gfx/gfx_driver.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_driver.cpp	2009-02-23 22:09:06 UTC (rev 38819)
+++ scummvm/trunk/engines/sci/gfx/gfx_driver.cpp	2009-02-23 22:36:19 UTC (rev 38820)
@@ -36,7 +36,7 @@
 struct _scummvm_driver_state {
 	gfx_pixmap_t *priority[2];
 	byte *visual[3];
-	byte *pointer_data[2];
+	uint8 *pointer_data;
 	int xsize, ysize;
 	//int buckystate;
 	bool update_screen;
@@ -57,8 +57,7 @@
 	S->xsize = xfact * 320;
 	S->ysize = yfact * 200;
 
-	S->pointer_data[0] = NULL;
-	S->pointer_data[1] = NULL;
+	S->pointer_data = NULL;
 	//S->buckystate = 0;
 
 	for (i = 0; i < 2; i++) {
@@ -101,11 +100,8 @@
 			S->visual[i] = NULL;
 		}
 
-		for (i = 0; i < 2; i++)
-			if (S->pointer_data[i]) {
-				delete[] S->pointer_data[i];
-				S->pointer_data[i] = NULL;
-			}
+		delete[] S->pointer_data;
+		S->pointer_data = NULL;
 
 		delete S;
 	}
@@ -264,11 +260,42 @@
 
 // Mouse pointer operations
 
+static uint8 *create_scaled_cursor(gfx_driver_t *drv, gfx_pixmap_t *pointer, int mode)
+{
+	int linewidth = pointer->xl;
+	int lines = pointer->yl;
+	uint8 *data = new uint8[linewidth*lines];
+	uint8 *linebase = data, *pos;
+	uint8 *src = pointer->index_data;
+
+	for (int yc = 0; yc < pointer->index_yl; yc++) {
+		pos = linebase;
+
+		for (int xc = 0; xc < pointer->index_xl; xc++) {
+			for (int scalectr = 0; scalectr < drv->mode->xfact; scalectr++) {
+				*pos++ = *src;
+			}
+			src++;
+		}
+		for (int scalectr = 1; scalectr < drv->mode->yfact; scalectr++)
+			memcpy(linebase + linewidth * scalectr, linebase, linewidth);
+		linebase += linewidth * drv->mode->yfact;
+	}
+	return data;
+}
+
+
 static int scummvm_set_pointer(gfx_driver_t *drv, gfx_pixmap_t *pointer) {
 	if (pointer == NULL) {
 		g_system->showMouse(false);
 	} else {
-		g_system->setMouseCursor(pointer->index_data, pointer->xl, pointer->yl, pointer->xoffset, pointer->yoffset);
+		if (drv->mode->xfact > 1 || drv->mode->yfact > 1) {
+			delete[] S->pointer_data;
+			S->pointer_data = create_scaled_cursor(drv, pointer, 1);
+			g_system->setMouseCursor(S->pointer_data, pointer->xl, pointer->yl, pointer->xoffset, pointer->yoffset);
+		} else {
+			g_system->setMouseCursor(pointer->index_data, pointer->xl, pointer->yl, pointer->xoffset, pointer->yoffset);
+		}
 		g_system->showMouse(true);
 	}
 


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