[Scummvm-git-logs] scummvm master -> 936fd67c3c0b6290132f8d5ae365589a9539efcf

sev- noreply at scummvm.org
Sat Sep 21 21:15:54 UTC 2024


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
71052ff738 QDENGINE: Avoid double free on exit
687b151102 QDENGINE: Eliminate global constructors
936fd67c3c QDENGINE: Eliminate more global constructors


Commit: 71052ff738daa22b6f9834fd720a6b311014a5b3
    https://github.com/scummvm/scummvm/commit/71052ff738daa22b6f9834fd720a6b311014a5b3
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-09-21T22:37:36+02:00

Commit Message:
QDENGINE: Avoid double free on exit

Changed paths:
    engines/qdengine/system/sound/snd_sound.cpp
    engines/qdengine/system/sound/snd_sound.h


diff --git a/engines/qdengine/system/sound/snd_sound.cpp b/engines/qdengine/system/sound/snd_sound.cpp
index 722ff71a811..72b58996544 100644
--- a/engines/qdengine/system/sound/snd_sound.cpp
+++ b/engines/qdengine/system/sound/snd_sound.cpp
@@ -42,7 +42,7 @@ bool sndSound::create_sound_buffer() {
 
 bool sndSound::release_sound_buffer() {
 	if (!is_stopped())
-		stop();
+		stop(false);
 
 	return true;
 }
@@ -69,11 +69,11 @@ bool sndSound::play() {
 	return true;
 }
 
-bool sndSound::stop() {
+bool sndSound::stop(bool rewind) {
 	debugC(5, kDebugSound, "sndSound::stop(). this: %p",  (void *)this);
 	g_system->getMixer()->stopHandle(_audHandle);
 
-	if (_sound && _sound->_audioStream)
+	if (rewind && _sound && _sound->_audioStream)
 		_sound->_audioStream->seek(0);
 
 	_isStopped = true;
diff --git a/engines/qdengine/system/sound/snd_sound.h b/engines/qdengine/system/sound/snd_sound.h
index 196c235f7db..b1ed702a100 100644
--- a/engines/qdengine/system/sound/snd_sound.h
+++ b/engines/qdengine/system/sound/snd_sound.h
@@ -77,7 +77,7 @@ public:
 	//! Запускает проигрывание звука.
 	bool play();
 	//! Останавливает проигрывание звука.
-	bool stop();
+	bool stop(bool rewind = true);
 	//! Ставит звук на паузу.
 	void pause();
 	//! Возобновляет проигрывание.


Commit: 687b15110217266744491f0da98eaa7b717eb20b
    https://github.com/scummvm/scummvm/commit/687b15110217266744491f0da98eaa7b717eb20b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-09-21T22:37:40+02:00

Commit Message:
QDENGINE: Eliminate global constructors

Changed paths:
    engines/qdengine/qdcore/qd_interface_element.cpp
    engines/qdengine/qdcore/qd_interface_element.h
    engines/qdengine/qdcore/qd_interface_screen.cpp
    engines/qdengine/qdcore/qd_interface_text_window.h
    engines/qdengine/qdcore/qd_inventory_cell.cpp
    engines/qdengine/qdcore/qd_inventory_cell.h
    engines/qdengine/qdengine.h


diff --git a/engines/qdengine/qdcore/qd_interface_element.cpp b/engines/qdengine/qdcore/qd_interface_element.cpp
index e903213804f..e9574bd149b 100644
--- a/engines/qdengine/qdcore/qd_interface_element.cpp
+++ b/engines/qdengine/qdcore/qd_interface_element.cpp
@@ -38,8 +38,6 @@
 
 namespace QDEngine {
 
-Vect2i qdInterfaceElement::_screen_offset = Vect2i(0, 0);
-
 qdInterfaceElement::qdInterfaceElement() : _r(0, 0),
 	_option_ID(OPTION_NONE),
 	_screen_depth(0),
diff --git a/engines/qdengine/qdcore/qd_interface_element.h b/engines/qdengine/qdcore/qd_interface_element.h
index a0aeaad655a..002d5780b4c 100644
--- a/engines/qdengine/qdcore/qd_interface_element.h
+++ b/engines/qdengine/qdcore/qd_interface_element.h
@@ -117,7 +117,7 @@ public:
 
 	//! Возвращает экранные координаты центра элемента.
 	virtual const Vect2i r() const {
-		return _r + _screen_offset;
+		return _r + g_engine->screen_offset();
 	}
 	//! Устанавливает экранные координаты центра элемента.
 	void set_r(const Vect2i &v) {
@@ -220,13 +220,6 @@ public:
 		_is_locked = state;
 	}
 
-	static const Vect2i &screen_offset() {
-		return _screen_offset;
-	}
-	static void set_screen_offset(const Vect2i &offset) {
-		_screen_offset = offset;
-	}
-
 protected:
 
 	//! Запись данных в скрипт.
@@ -266,8 +259,6 @@ private:
 
 	grScreenRegion _last_screen_region;
 	const qdAnimationFrame *_last_animation_frame;
-
-	static Vect2i _screen_offset;
 };
 
 } // namespace QDEngine
diff --git a/engines/qdengine/qdcore/qd_interface_screen.cpp b/engines/qdengine/qdcore/qd_interface_screen.cpp
index de75c0a3a7c..d8adf3b5985 100644
--- a/engines/qdengine/qdcore/qd_interface_screen.cpp
+++ b/engines/qdengine/qdcore/qd_interface_screen.cpp
@@ -116,11 +116,9 @@ bool qdInterfaceScreen::quant(float dt) {
 		int x = round(float(_autohide_offset.x) * _autohide_phase);
 		int y = round(float(_autohide_offset.y) * _autohide_phase);
 
-		qdInterfaceElement::set_screen_offset(Vect2i(x, y));
-		qdInventoryCell::set_screen_offset(Vect2i(x, y));
+		g_engine->set_screen_offset(Vect2i(x, y));
 	} else {
-		qdInterfaceElement::set_screen_offset(Vect2i(0, 0));
-		qdInventoryCell::set_screen_offset(Vect2i(0, 0));
+		g_engine->set_screen_offset(Vect2i(0, 0));
 	}
 
 	for (element_list_t::const_iterator it = element_list().begin(); it != element_list().end(); ++it) {
diff --git a/engines/qdengine/qdcore/qd_interface_text_window.h b/engines/qdengine/qdcore/qd_interface_text_window.h
index 1a703b2833a..aa3afce3691 100644
--- a/engines/qdengine/qdcore/qd_interface_text_window.h
+++ b/engines/qdengine/qdcore/qd_interface_text_window.h
@@ -109,7 +109,7 @@ public:
 
 	//! Возвращает экранные координаты центра окна.
 	virtual const Vect2i r() const {
-		return qdInterfaceElement::r() - qdInterfaceElement::screen_offset();
+		return qdInterfaceElement::r() - g_engine->screen_offset();
 	}
 
 	//! Отрисовка окна.
diff --git a/engines/qdengine/qdcore/qd_inventory_cell.cpp b/engines/qdengine/qdcore/qd_inventory_cell.cpp
index 5862169c12f..4f61483270b 100644
--- a/engines/qdengine/qdcore/qd_inventory_cell.cpp
+++ b/engines/qdengine/qdcore/qd_inventory_cell.cpp
@@ -74,7 +74,6 @@ bool qdInventoryCellType::save_script(Common::WriteStream &fh, int indent) const
 
 // class qdInventoryCell
 
-Vect2i qdInventoryCell::_screen_offset = Vect2i(0, 0);
 uint32 qdInventoryCell::_shadow_color = 0;
 int qdInventoryCell::_shadow_alpha = -1;
 
diff --git a/engines/qdengine/qdcore/qd_inventory_cell.h b/engines/qdengine/qdcore/qd_inventory_cell.h
index bd033763368..644b98d88e4 100644
--- a/engines/qdengine/qdcore/qd_inventory_cell.h
+++ b/engines/qdengine/qdcore/qd_inventory_cell.h
@@ -152,12 +152,6 @@ public:
 		_shadow_color = color;
 		_shadow_alpha = alpha;
 	}
-	static const Vect2i &screen_offset() {
-		return _screen_offset;
-	}
-	static void set_screen_offset(const Vect2i &offset) {
-		_screen_offset = offset;
-	}
 
 private:
 	//! Тип ячейки.
@@ -172,7 +166,6 @@ private:
 	//! Объект, который лежит в ячейке.
 	mutable qdGameObjectAnimated *_object;
 
-	static Vect2i _screen_offset;
 	static uint32 _shadow_color;
 	static int _shadow_alpha;
 };
@@ -190,7 +183,7 @@ public:
 	qdInventoryCellSet &operator = (const qdInventoryCellSet &set);
 
 	const Vect2s screen_pos() const {
-		return _screen_pos + qdInventoryCell::screen_offset();
+		return _screen_pos + g_engine->screen_offset();
 	}
 	void set_screen_pos(const Vect2s &pos) {
 		_screen_pos = pos;
diff --git a/engines/qdengine/qdengine.h b/engines/qdengine/qdengine.h
index 5638e4f82c9..3915c82e386 100644
--- a/engines/qdengine/qdengine.h
+++ b/engines/qdengine/qdengine.h
@@ -126,11 +126,21 @@ public:
 
 	int engineMain();
 
+	const Vect2i &screen_offset() {
+		return _screen_offset;
+	}
+	void set_screen_offset(const Vect2i &offset) {
+		_screen_offset = offset;
+	}
+
+public:
 	int _thumbSizeX = 0, _thumbSizeY = 0;
 	bool _debugDraw = false;
 	bool _debugDrawGrid = false;
 	int _gameVersion = 0;
 
+	Vect2i _screen_offset = Vect2i(0, 0);
+
 	// Default text format
 	qdScreenTextFormat _default_format;
 	// Global format


Commit: 936fd67c3c0b6290132f8d5ae365589a9539efcf
    https://github.com/scummvm/scummvm/commit/936fd67c3c0b6290132f8d5ae365589a9539efcf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2024-09-21T23:15:25+02:00

Commit Message:
QDENGINE: Eliminate more global constructors

Changed paths:
    engines/qdengine/qdcore/qd_game_scene.cpp
    engines/qdengine/qdcore/qd_game_scene.h
    engines/qdengine/qdengine.h


diff --git a/engines/qdengine/qdcore/qd_game_scene.cpp b/engines/qdengine/qdcore/qd_game_scene.cpp
index bec267234b8..3f6c4efe8d8 100644
--- a/engines/qdengine/qdcore/qd_game_scene.cpp
+++ b/engines/qdengine/qdcore/qd_game_scene.cpp
@@ -53,10 +53,7 @@ struct qdGridZoneOrdering {
 };
 
 fpsCounter *g_fpsCounter = nullptr;
-grScreenRegion qdGameScene::_fps_region = grScreenRegion_EMPTY;
-grScreenRegion qdGameScene::_fps_region_last = grScreenRegion_EMPTY;
 char qdGameScene::_fps_string[255];
-Std::vector<qdGameObject *> qdGameScene::_visible_objects;
 
 qdGameScene::qdGameScene() : _mouse_click_object(NULL),
 	_mouse_right_click_object(NULL),
@@ -186,7 +183,7 @@ void qdGameScene::redraw() {
 
 			switch (flags() & (CYCLE_X | CYCLE_Y)) {
 			case CYCLE_X:
-				for (Std::vector<qdGameObject *>::reverse_iterator it = _visible_objects.rbegin(); it != _visible_objects.rend(); ++it) {
+				for (Std::vector<qdGameObject *>::reverse_iterator it = g_engine->_visible_objects.rbegin(); it != g_engine->_visible_objects.rend(); ++it) {
 					for (int i = 0; i < 8; i += 4) {
 						Vect2i pos = (*it)->screen_pos() + Vect2i(offs_x[i], offs_y[i]);
 						Vect2i sz = (*it)->screen_size();
@@ -200,7 +197,7 @@ void qdGameScene::redraw() {
 				}
 				break;
 			case CYCLE_Y:
-				for (Std::vector<qdGameObject *>::reverse_iterator it = _visible_objects.rbegin(); it != _visible_objects.rend(); ++it) {
+				for (Std::vector<qdGameObject *>::reverse_iterator it = g_engine->_visible_objects.rbegin(); it != g_engine->_visible_objects.rend(); ++it) {
 					for (int i = 2; i < 8; i += 4) {
 						Vect2i pos = (*it)->screen_pos() + Vect2i(offs_x[i], offs_y[i]);
 						Vect2i sz = (*it)->screen_size();
@@ -214,7 +211,7 @@ void qdGameScene::redraw() {
 				}
 				break;
 			case CYCLE_X | CYCLE_Y:
-				for (Std::vector<qdGameObject *>::reverse_iterator it = _visible_objects.rbegin(); it != _visible_objects.rend(); ++it) {
+				for (Std::vector<qdGameObject *>::reverse_iterator it = g_engine->_visible_objects.rbegin(); it != g_engine->_visible_objects.rend(); ++it) {
 					for (int i = 0; i < 8; i++) {
 						Vect2i pos = (*it)->screen_pos() + Vect2i(offs_x[i], offs_y[i]);
 						Vect2i sz = (*it)->screen_size();
@@ -229,7 +226,7 @@ void qdGameScene::redraw() {
 				break;
 			}
 		} else {
-			for (Std::vector<qdGameObject *>::reverse_iterator it = _visible_objects.rbegin(); it != _visible_objects.rend(); ++it)
+			for (Std::vector<qdGameObject *>::reverse_iterator it = g_engine->_visible_objects.rbegin(); it != g_engine->_visible_objects.rend(); ++it)
 				(*it)->redraw();
 		}
 	}
@@ -249,7 +246,7 @@ bool qdGameScene::mouse_handler(int x, int y, mouseDispatcher::mouseEvent ev) {
 				break;
 			}
 		}
-		for (Std::vector<qdGameObject *>::iterator io = _visible_objects.begin(); io != _visible_objects.end(); ++io) {
+		for (Std::vector<qdGameObject *>::iterator io = g_engine->_visible_objects.begin(); io != g_engine->_visible_objects.end(); ++io) {
 			if (!(*io)->check_flag(QD_OBJ_DISABLE_MOUSE_FLAG) && (*io)->named_object_type() != QD_NAMED_OBJECT_STATIC_OBJ) {
 				if ((*io)->hit(x, y)) {
 					_mouse_hover_object = *io;
@@ -284,7 +281,7 @@ bool qdGameScene::mouse_handler(int x, int y, mouseDispatcher::mouseEvent ev) {
 }
 
 qdGameObject *qdGameScene::get_hitted_obj(int x, int y) {
-	for (Std::vector<qdGameObject *>::iterator io = _visible_objects.begin(); io != _visible_objects.end(); ++io) {
+	for (Std::vector<qdGameObject *>::iterator io = g_engine->_visible_objects.begin(); io != g_engine->_visible_objects.end(); ++io) {
 		if (!(*io)->check_flag(QD_OBJ_DISABLE_MOUSE_FLAG) && (*io)->named_object_type() != QD_NAMED_OBJECT_STATIC_OBJ)
 			if ((*io)->hit(x, y))
 				return (*io);
@@ -359,7 +356,7 @@ void qdGameScene::load_script(const xml::tag *p) {
 		}
 	}
 
-	_visible_objects.reserve(object_list().size());
+	g_engine->_visible_objects.reserve(object_list().size());
 	_personages.reserve(personages_count);
 
 	for (qdGameObjectList::const_iterator it = object_list().begin(); it != object_list().end(); ++it) {
@@ -514,7 +511,7 @@ void qdGameScene::debug_redraw() {
 		v1 = qdCamera::current_camera()->global2scr(Vect3f(300,-300,0));
 		grDispatcher::instance()->line(v0.x,v0.y,v1.x,v1.y,cl,2);
 
-		for (Std::vector<qdGameObject *>::reverse_iterator it = _visible_objects.rbegin(); it != _visible_objects.rend(); ++it)
+		for (Std::vector<qdGameObject *>::reverse_iterator it = g_engine->_visible_objects.rbegin(); it != g_engine->_visible_objects.rend(); ++it)
 			(*it)->debug_redraw();
 	}
 
@@ -632,18 +629,18 @@ struct qdObjectOrdering {
 };
 
 bool qdGameScene::init_visible_objects_list() {
-	_visible_objects.clear();
+	g_engine->_visible_objects.clear();
 
 	for (auto &it : object_list()) {
 		it->update_screen_pos();
 		if (it->is_visible() && !it->check_flag(QD_OBJ_SCREEN_COORDS_FLAG)) {
 			// The original depended on stable sort, so we imitate it here
 			// since Common::sort() is unstable
-			it->setTempPosInList(_visible_objects.size());
-			_visible_objects.push_back(it);
+			it->setTempPosInList(g_engine->_visible_objects.size());
+			g_engine->_visible_objects.push_back(it);
 		}
 	}
-	Common::sort(_visible_objects.begin(), _visible_objects.end(), qdObjectOrdering());
+	Common::sort(g_engine->_visible_objects.begin(), g_engine->_visible_objects.end(), qdObjectOrdering());
 
 	return true;
 }
@@ -990,10 +987,10 @@ void qdGameScene::pre_redraw() {
 			}
 		}
 
-		if (!_fps_region.is_empty())
-			dp->add_redraw_region(_fps_region);
-		if (!_fps_region_last.is_empty())
-			dp->add_redraw_region(_fps_region_last);
+		if (!g_engine->_fps_region.is_empty())
+			dp->add_redraw_region(g_engine->_fps_region);
+		if (!g_engine->_fps_region_last.is_empty())
+			dp->add_redraw_region(g_engine->_fps_region_last);
 	}
 
 	if (ConfMan.getBool("show_fps")) {
@@ -1004,9 +1001,9 @@ void qdGameScene::pre_redraw() {
 
 		int sx = grDispatcher::instance()->textWidth(_fps_string);
 		int sy = grDispatcher::instance()->textHeight(_fps_string);
-		_fps_region = grScreenRegion(10 + sx / 2, 10 + sy / 2, sx, sy);
+		g_engine->_fps_region = grScreenRegion(10 + sx / 2, 10 + sy / 2, sx, sy);
 	} else
-		_fps_region.clear();
+		g_engine->_fps_region.clear();
 
 	fps_counter()->quant();
 }
@@ -1015,7 +1012,7 @@ void qdGameScene::post_redraw() {
 	for (qdGameObjectList::const_iterator io = object_list().begin(); io != object_list().end(); ++io)
 		(*io)->post_redraw();
 
-	_fps_region_last = _fps_region;
+	g_engine->_fps_region_last = g_engine->_fps_region;
 }
 
 qdConditionalObject::trigger_start_mode qdGameScene::trigger_start() {
diff --git a/engines/qdengine/qdcore/qd_game_scene.h b/engines/qdengine/qdcore/qd_game_scene.h
index 6fc9030ae9c..623decf8365 100644
--- a/engines/qdengine/qdcore/qd_game_scene.h
+++ b/engines/qdengine/qdcore/qd_game_scene.h
@@ -284,10 +284,6 @@ private:
 
 	uint32 _zone_update_count;
 
-	static Std::vector<qdGameObject *> _visible_objects;
-
-	static grScreenRegion _fps_region;
-	static grScreenRegion _fps_region_last;
 	static char _fps_string[255];
 
 	bool init_visible_objects_list();
diff --git a/engines/qdengine/qdengine.h b/engines/qdengine/qdengine.h
index 3915c82e386..b8805fea6ed 100644
--- a/engines/qdengine/qdengine.h
+++ b/engines/qdengine/qdengine.h
@@ -140,6 +140,9 @@ public:
 	int _gameVersion = 0;
 
 	Vect2i _screen_offset = Vect2i(0, 0);
+	grScreenRegion _fps_region = grScreenRegion_EMPTY;
+	grScreenRegion _fps_region_last = grScreenRegion_EMPTY;
+	Std::vector<qdGameObject *> _visible_objects;
 
 	// Default text format
 	qdScreenTextFormat _default_format;




More information about the Scummvm-git-logs mailing list