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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Fri Apr 24 12:46:46 CEST 2009


Revision: 40105
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40105&view=rev
Author:   fingolfin
Date:     2009-04-24 10:46:46 +0000 (Fri, 24 Apr 2009)

Log Message:
-----------
SCI: Rewrote the port_refs code (fixing at least three serious bugs in it. Wow, crappy)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/gfx/gfx_state_internal.h
    scummvm/trunk/engines/sci/gfx/gfx_widgets.cpp

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-04-24 10:46:20 UTC (rev 40104)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-04-24 10:46:46 UTC (rev 40105)
@@ -2437,7 +2437,6 @@
 	unsigned int goner_nr = SKPV(0);
 	GfxPort *goner;
 	GfxPort *pred;
-	int id = s->visual->port_refs_nr;
 
 	goner = gfxw_find_port(s->visual, goner_nr);
 	if ((goner_nr < 3) || (goner == NULL)) {
@@ -2458,11 +2457,12 @@
 		s->port = pred;
 
 	// Find the last port that exists and that isn't marked no-switch
-	while ((!s->visual->port_refs[id] && id >= 0) || (s->visual->port_refs[id]->_flags & GFXW_FLAG_NO_IMPLICIT_SWITCH))
+	int id = s->visual->_portRefs.size() - 1;
+	while (id > 0 && (!s->visual->_portRefs[id] || (s->visual->_portRefs[id]->_flags & GFXW_FLAG_NO_IMPLICIT_SWITCH)))
 		id--;
 
 	sciprintf("Activating port %d after disposing window %d\n", id, goner_nr);
-	s->port = s->visual->port_refs[id];
+	s->port = (id >= 0) ? s->visual->_portRefs[id] : 0;
 
 	if (!s->port)
 		s->port = gfxw_find_default_port(s->visual);

Modified: scummvm/trunk/engines/sci/gfx/gfx_state_internal.h
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_state_internal.h	2009-04-24 10:46:20 UTC (rev 40104)
+++ scummvm/trunk/engines/sci/gfx/gfx_state_internal.h	2009-04-24 10:46:46 UTC (rev 40105)
@@ -112,6 +112,7 @@
 	gfxw_visual_op *set_visual; /* Sets the visual the widget belongs to */
 
 	GfxWidget(gfxw_widget_type_t type);
+	virtual ~GfxWidget();
 };
 
 
@@ -217,8 +218,7 @@
 
 #define GFXW_IS_VISUAL(widget) ((widget)->_type == GFXW_VISUAL)
 struct GfxVisual : public GfxContainer {
-	GfxPort **port_refs; /* References to ports */
-	int port_refs_nr;
+	Common::Array<GfxPort *> _portRefs; /* References to ports */
 	int font_nr; /* Default font */
 	gfx_state_t *gfx_state;
 

Modified: scummvm/trunk/engines/sci/gfx/gfx_widgets.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_widgets.cpp	2009-04-24 10:46:20 UTC (rev 40104)
+++ scummvm/trunk/engines/sci/gfx/gfx_widgets.cpp	2009-04-24 10:46:46 UTC (rev 40105)
@@ -179,6 +179,11 @@
 	return 0;
 }
 
+GfxWidget::~GfxWidget() {
+	_magic = GFXW_MAGIC_INVALID;
+	_gfxw_debug_remove_widget(this);
+}
+
 #define VERIFY_WIDGET(w) \
 	if (verify_widget((GfxWidget *)(w))) { GFXERROR("Error occured while validating widget\n"); }
 
@@ -197,9 +202,7 @@
 		}
 	}
 
-	widget->_magic = GFXW_MAGIC_INVALID;
 	delete widget;
-	_gfxw_debug_remove_widget(widget);
 }
 
 #define GFX_ASSERT(_x) \
@@ -1544,7 +1547,6 @@
 
 static int _gfxwop_visual_free(GfxWidget *widget) {
 	GfxVisual *visual = (GfxVisual *) widget;
-	GfxPort **portrefs;
 	int retval;
 
 	if (!GFXW_IS_VISUAL(visual)) {
@@ -1553,17 +1555,12 @@
 		return 1;
 	}
 
-	portrefs = visual->port_refs;
-
 	retval = _gfxwop_container_free(widget);
 
-	free(portrefs);
-
 	return 0;
 }
 
 static int _gfxwop_visual_print(GfxWidget *widget, int indentation) {
-	int i;
 	int comma = 0;
 	GfxVisual *visual = (GfxVisual *) widget;
 
@@ -1575,8 +1572,8 @@
 
 	_gfxw_print_widget(widget, indentation);
 	sciprintf("VISUAL; ports={");
-	for (i = 0; i < visual->port_refs_nr; i++)
-		if (visual->port_refs[i]) {
+	for (uint i = 0; i < visual->_portRefs.size(); i++) {
+		if (visual->_portRefs[i]) {
 			if (comma)
 				sciprintf(",");
 			else
@@ -1584,6 +1581,7 @@
 
 			sciprintf("%d", i);
 		}
+	}
 	sciprintf("}\n");
 
 	return _w_gfxwop_container_print(widget, indentation);
@@ -1617,23 +1615,17 @@
 	font_nr = font;
 	gfx_state = state;
 
-	port_refs_nr = 16;
-	port_refs = (GfxPort **)sci_calloc(sizeof(GfxPort), port_refs_nr);	// FIXME: Isn't this bogus???
-
 	_gfxw_set_ops_VISUAL(this);
 }
 
 static int _visual_find_free_ID(GfxVisual *visual) {
-	int id = 0;
-	int newports = 16;
+	uint id = 0;
 
-	while (visual->port_refs[id] && id < visual->port_refs_nr)
+	while (id < visual->_portRefs.size() && visual->_portRefs[id])
 		id++;
 
-	if (id == visual->port_refs_nr) { // Out of ports?
-		visual->port_refs_nr += newports;
-		visual->port_refs = (GfxPort**)sci_realloc(visual->port_refs, visual->port_refs_nr);	// FIXME: Isn't this bogus???
-		memset(visual->port_refs + id, 0, newports * sizeof(GfxPort *)); // Clear new port refs
+	if (id == visual->_portRefs.size()) { // Out of ports?
+		visual->_portRefs.push_back(0);
 	}
 
 	return id;
@@ -1681,15 +1673,15 @@
 		GfxVisual *visual = port->_visual;
 		int ID = port->_ID;
 
-		if (ID < 0 || ID >= visual->port_refs_nr) {
-			GFXWARN("Attempt to free port #%d; allowed: [0..%d]!\n", ID, visual->port_refs_nr);
+		if (ID < 0 || ID >= (int)visual->_portRefs.size()) {
+			GFXWARN("Attempt to free port #%d; allowed: [0..%d]!\n", ID, visual->_portRefs.size());
 			return GFX_ERROR;
 		}
 
-		if (visual->port_refs[ID] != port) {
-			GFXWARN("While freeing port %d: Port is at %p, but port list indicates %p", ID, (void *)port, (void *)visual->port_refs[ID]);
+		if (visual->_portRefs[ID] != port) {
+			GFXWARN("While freeing port %d: Port is at %p, but port list indicates %p", ID, (void *)port, (void *)visual->_portRefs[ID]);
 		} else
-			visual->port_refs[ID] = NULL;
+			visual->_portRefs[ID] = NULL;
 
 	}
 
@@ -1804,7 +1796,7 @@
 	_bgcolor = bgcolor_;
 	font_nr = visual_->font_nr;
 	_ID = _visual_find_free_ID(visual_);
-	visual_->port_refs[_ID] = this;
+	visual_->_portRefs[_ID] = this;
 
 	_gfxw_set_ops_PORT(this);
 }
@@ -1838,17 +1830,17 @@
 }
 
 GfxPort *gfxw_find_port(GfxVisual *visual, int ID) {
-	if (ID < 0 || ID >= visual->port_refs_nr)
+	if (ID < 0 || ID >= (int)visual->_portRefs.size())
 		return NULL;
 
-	return visual->port_refs[ID];
+	return visual->_portRefs[ID];
 }
 
 GfxPort *gfxw_find_default_port(GfxVisual *visual) {
-	int id = visual->port_refs_nr;
+	int id = visual->_portRefs.size();
 
 	while (id--) {
-		GfxPort *port = visual->port_refs[id];
+		GfxPort *port = visual->_portRefs[id];
 
 		if (port)
 			return port;


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