[Scummvm-git-logs] scummvm master -> 07c1e5cc2aa3cb285c48ceb488e7575e43e8ecad

sev- noreply at scummvm.org
Sun Jun 12 13:08:04 UTC 2022


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

Summary:
07c1e5cc2a GUI: Fix thumbnails for event recorder dialogue


Commit: 07c1e5cc2aa3cb285c48ceb488e7575e43e8ecad
    https://github.com/scummvm/scummvm/commit/07c1e5cc2aa3cb285c48ceb488e7575e43e8ecad
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2022-06-12T15:08:01+02:00

Commit Message:
GUI: Fix thumbnails for event recorder dialogue

Also prevent segmentation fault cases related to low-res or switching from low-res to hi-res

And fix memory leak related to loading and scaling of the thumbnail image

A lot of the updated logic is borrowed from the saveload-dialog.cpp for the simple list view (with the thumbnail to the right of the list).

Changed paths:
    common/recorderfile.cpp
    gui/recorderdialog.cpp
    gui/recorderdialog.h


diff --git a/common/recorderfile.cpp b/common/recorderfile.cpp
index 16817aee629..0cfbea85387 100644
--- a/common/recorderfile.cpp
+++ b/common/recorderfile.cpp
@@ -696,7 +696,7 @@ Graphics::Surface *PlaybackFile::getScreenShot(int number) {
 		if (screenCount == number) {
 			screenCount++;
 			_readStream->seek(-4, SEEK_CUR);
-			Graphics::Surface *thumbnail;
+			Graphics::Surface *thumbnail = nullptr;
 			return Graphics::loadThumbnail(*_readStream, thumbnail) ? thumbnail : NULL;
 		} else {
 			uint32 size = _readStream->readUint32BE();
diff --git a/gui/recorderdialog.cpp b/gui/recorderdialog.cpp
index 4e4b8f12bb6..b36cfdd24f4 100644
--- a/gui/recorderdialog.cpp
+++ b/gui/recorderdialog.cpp
@@ -40,6 +40,8 @@
 
 namespace GUI {
 
+#define SCALEVALUE(val) ((val) * g_gui.getScaleFactor())
+
 enum {
 	kRecordCmd = 'RCRD',
 	kPlaybackCmd = 'PBCK',
@@ -55,6 +57,10 @@ RecorderDialog::RecorderDialog() : Dialog("RecorderDialog"), _list(nullptr), _cu
 	_currentScreenshotText = nullptr;
 	_authorText = nullptr;
 	_notesText = nullptr;
+	_container = nullptr;
+	_gfxWidget = nullptr;
+	_nextScreenshotBtn = nullptr;
+	_prevScreenshotBtn = nullptr;
 
 	_backgroundType = ThemeEngine::kDialogBackgroundSpecial;
 
@@ -75,20 +81,15 @@ RecorderDialog::RecorderDialog() : Dialog("RecorderDialog"), _list(nullptr), _cu
 	_playbackButton->setEnabled(false);
 
 	_gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10);
-	_container = new GUI::ContainerWidget(this, "RecorderDialog.Thumbnail");
-	if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 1) {
-		new GUI::ButtonWidget(this,"RecorderDialog.NextScreenShotButton", Common::U32String("<"), Common::U32String(), kPrevScreenshotCmd);
-		new GUI::ButtonWidget(this, "RecorderDialog.PreviousScreenShotButton", Common::U32String(">"), Common::U32String(), kNextScreenshotCmd);
-		_currentScreenshotText = new StaticTextWidget(this, "RecorderDialog.currentScreenshot", Common::U32String("0/0"));
-		_authorText = new StaticTextWidget(this, "RecorderDialog.Author", _("Author: "));
-		_notesText = new StaticTextWidget(this, "RecorderDialog.Notes", _("Notes: "));
-	}
-	if (_gfxWidget)
-		_gfxWidget->setGfx((Graphics::Surface *)nullptr);
+	_gfxWidget->useThemeTransparency(false);
+
+	addThumbnailContainerButtonsAndText();
 }
 
 
 void RecorderDialog::reflowLayout() {
+	addThumbnailContainerButtonsAndText();
+
 	Dialog::reflowLayout();
 
 	if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 1) {
@@ -99,24 +100,82 @@ void RecorderDialog::reflowLayout() {
 			error("Error when loading position data for Recorder Thumbnails");
 		}
 
-		int thumbW = kThumbnailWidth;
-		int thumbH = kThumbnailHeight2;
+		int thumbW = SCALEVALUE(kThumbnailWidth);
+		int thumbH = SCALEVALUE(kThumbnailHeight2);
 		int thumbX = x + (w >> 1) - (thumbW >> 1);
 		int thumbY = y + kLineHeight;
 
-		_container->resize(x, y, w, h);
-		_gfxWidget->resize(thumbX, thumbY, thumbW, thumbH);
+		_gfxWidget->resize(thumbX, thumbY, thumbW, thumbH, false);
+		_gfxWidget->setVisible(true);
 
+		_container->resize(x, y, w, h, false);
 		_container->setVisible(true);
-		_gfxWidget->setVisible(true);
+
+		_notesText->setVisible(true);
+		_authorText->setVisible(true);
+
+		_nextScreenshotBtn->setVisible(true);
+		_prevScreenshotBtn->setVisible(true);
+
 		updateSelection(false);
 	} else {
-		_container->setVisible(false);
+		if (_container) _container->setVisible(false);
 		_gfxWidget->setVisible(false);
+		if (_notesText) _notesText->setVisible(false);
+		if (_authorText) _authorText->setVisible(false);
+		if (_nextScreenshotBtn) _nextScreenshotBtn->setVisible(false);
+		if (_prevScreenshotBtn) _prevScreenshotBtn->setVisible(false);
 	}
 }
 
-
+void RecorderDialog::addThumbnailContainerButtonsAndText() {
+	// When switching layouts, create / remove the thumbnail container as needed
+	if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 1) {
+		if (!_container)
+			_container = new ContainerWidget(this, "RecorderDialog.Thumbnail");
+		if (!_nextScreenshotBtn)
+			_nextScreenshotBtn = new GUI::ButtonWidget(this,"RecorderDialog.NextScreenShotButton", Common::U32String("<"), Common::U32String(), kPrevScreenshotCmd);
+		if (!_prevScreenshotBtn)
+			_prevScreenshotBtn = new GUI::ButtonWidget(this, "RecorderDialog.PreviousScreenShotButton", Common::U32String(">"), Common::U32String(), kNextScreenshotCmd);
+		if (!_currentScreenshotText)
+			_currentScreenshotText = new StaticTextWidget(this, "RecorderDialog.currentScreenshot", Common::U32String("0/0"));
+		if (!_authorText)
+			_authorText = new StaticTextWidget(this, "RecorderDialog.Author", _("Author: "));
+		if (!_notesText)
+			_notesText = new StaticTextWidget(this, "RecorderDialog.Notes", _("Notes: "));
+	} else if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 0) {
+		if (_container) {
+			removeWidget(_container);
+			delete _container;
+			_container = nullptr;
+		}
+		if (_nextScreenshotBtn) {
+			removeWidget(_nextScreenshotBtn);
+			delete _nextScreenshotBtn;
+			_nextScreenshotBtn = nullptr;
+		}
+		if (_prevScreenshotBtn) {
+			removeWidget(_prevScreenshotBtn);
+			delete _prevScreenshotBtn;
+			_prevScreenshotBtn = nullptr;
+		}
+		if (_currentScreenshotText) {
+			removeWidget(_currentScreenshotText);
+			delete _currentScreenshotText;
+			_currentScreenshotText = nullptr;
+		}
+		if (_authorText) {
+			removeWidget(_authorText);
+			delete _authorText;
+			_authorText = nullptr;
+		}
+		if (_notesText) {
+			removeWidget(_notesText);
+			delete _notesText;
+			_notesText = nullptr;
+		}
+	}
+}
 
 void RecorderDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
 	switch(cmd) {
@@ -215,6 +274,10 @@ void RecorderDialog::updateList() {
 
 int RecorderDialog::runModal(Common::String &target) {
 	_target = target;
+	if (_gfxWidget)
+		_gfxWidget->setGfx((Graphics::ManagedSurface *)nullptr);
+
+	reflowLayout();
 	updateList();
 	return Dialog::runModal();
 }
@@ -235,17 +298,13 @@ void RecorderDialog::updateSelection(bool redraw) {
 	_gfxWidget->setGfx(-1, -1, 0, 0, 0);
 	_screenShotsCount = 0;
 	_currentScreenshot = 0;
-	updateScreenShotsText();
 	if (_list->getSelected() >= 0) {
 		_authorText->setLabel(_("Author: ") + Common::U32String(_fileHeaders[_list->getSelected()].author));
 		_notesText->setLabel(_("Notes: ") + Common::U32String(_fileHeaders[_list->getSelected()].notes));
 
 		_firstScreenshotUpdate = true;
 		updateScreenshot();
-		if ((_screenShotsCount) > 0) {
-			_currentScreenshot = 1;
-		}
-		updateScreenshot();
+		updateScreenShotsText();
 	} else {
 		_authorText->setLabel(_("Author: "));
 		_notesText->setLabel(_("Notes: "));
@@ -255,33 +314,51 @@ void RecorderDialog::updateSelection(bool redraw) {
 		_gfxWidget->markAsDirty();
 		updateScreenShotsText();
 	}
+
+	if (redraw) {
+		_gfxWidget->markAsDirty();
+		_authorText->markAsDirty();
+		_notesText->markAsDirty();
+		updateScreenShotsText();
+
+		g_gui.scheduleTopDialogRedraw();
+	}
 }
 
 void RecorderDialog::updateScreenshot() {
 	if (_list->getSelected() == -1) {
 		return;
 	}
+	if (_firstScreenshotUpdate) {
+		_playbackFile.openRead(_fileHeaders[_list->getSelected()].fileName);
+		_screenShotsCount = _playbackFile.getScreensCount();
+		_currentScreenshot = _screenShotsCount > 0 ? 1 : 0;
+		_firstScreenshotUpdate = false;
+	}
+
+	if (_screenShotsCount == 0) {
+		return;
+	}
+
 	if (_currentScreenshot < 1) {
 		_currentScreenshot = _screenShotsCount;
 	}
 	if (_currentScreenshot > _screenShotsCount) {
 		_currentScreenshot = 1;
 	}
-	if (_firstScreenshotUpdate) {
-		_playbackFile.openRead(_fileHeaders[_list->getSelected()].fileName);
-		_screenShotsCount = _playbackFile.getScreensCount();
-		_firstScreenshotUpdate = false;
-	}
+
 	Graphics::Surface *srcsf = _playbackFile.getScreenShot(_currentScreenshot);
-	if (srcsf != nullptr) {
-		Graphics::Surface *destsf = Graphics::scale(*srcsf, _gfxWidget->getWidth(), _gfxWidget->getHeight());
-		_gfxWidget->setGfx(destsf);
-		updateScreenShotsText();
-		delete destsf;
-		delete srcsf;
+	Common::SharedPtr<Graphics::Surface> srcsfSptr = Common::SharedPtr<Graphics::Surface>(srcsf, Graphics::SurfaceDeleter());
+	if (srcsfSptr) {
+		Graphics::Surface *destsf = Graphics::scale(*srcsfSptr, _gfxWidget->getWidth(), _gfxWidget->getHeight());
+		Common::SharedPtr<Graphics::Surface> destsfSptr = Common::SharedPtr<Graphics::Surface>(destsf, Graphics::SurfaceDeleter());
+		if (destsfSptr && _gfxWidget->isVisible())
+			_gfxWidget->setGfx(destsf, false);
 	} else {
 		_gfxWidget->setGfx(-1, -1, 0, 0, 0);
 	}
+
+	updateScreenShotsText();
 	_gfxWidget->markAsDirty();
 }
 
@@ -291,6 +368,7 @@ void RecorderDialog::updateScreenShotsText() {
 	} else {
 		_currentScreenshotText->setLabel(Common::String::format("%d / %d", _currentScreenshot, _screenShotsCount));
 	}
+	_currentScreenshotText->markAsDirty();
 }
 
 } // End of namespace GUI
diff --git a/gui/recorderdialog.h b/gui/recorderdialog.h
index 6c8e3601d2a..e11d9fe39d1 100644
--- a/gui/recorderdialog.h
+++ b/gui/recorderdialog.h
@@ -53,11 +53,14 @@ private:
 	GUI::ButtonWidget *_editButton;
 	GUI::ButtonWidget *_deleteButton;
 	GUI::ButtonWidget *_playbackButton;
+	GUI::ButtonWidget *_nextScreenshotBtn;
+	GUI::ButtonWidget *_prevScreenshotBtn;
 
 	void updateList();
 	void updateScreenShotsText();
 	void updateSelection(bool redraw);
 	void updateScreenshot();
+	void addThumbnailContainerButtonsAndText();
 public:
 	Common::U32String _author;
 	Common::String    _name;




More information about the Scummvm-git-logs mailing list