From 4ad485032c66cefb06e2949a95de17458d40407d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 30 Jul 2024 04:44:27 +0200 Subject: [PATCH] QDENGINE: Initial code for reading savegame thumbnails from ExtendedSave --- engines/qdengine/qdcore/qd_interface_save.cpp | 12 ++++--- engines/qdengine/qdcore/qd_sprite.cpp | 33 +++++++++++++++++++ engines/qdengine/qdengine.h | 2 ++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/engines/qdengine/qdcore/qd_interface_save.cpp b/engines/qdengine/qdcore/qd_interface_save.cpp index 7af5d466cb0..0542653af8d 100644 --- a/engines/qdengine/qdcore/qd_interface_save.cpp +++ b/engines/qdengine/qdcore/qd_interface_save.cpp @@ -165,15 +165,16 @@ bool qdInterfaceSave::init(bool is_game_active) { ExtendedSavegameHeader header; - if (MetaEngine::readSavegameHeader(saveFile, &header, false)) + if (MetaEngine::readSavegameHeader(saveFile, &header, true)) save_title_ = header.description.c_str(); + + delete saveFile; + + thumbnail_.set_animation_file(Common::String::format("save:%s", saveFileName.c_str()).c_str()); } else { save_title_ = ""; } - if (app_io::is_file_exist(thumbnail_file())) - thumbnail_.set_animation_file(thumbnail_file().c_str()); - set_state(&frame_); if (!save_mode_ && !fileExists) { @@ -338,6 +339,9 @@ bool qdInterfaceSave::load_script_body(const xml::tag *p) { break; case QDSCR_INTERFACE_THUMBNAIL_SIZE: xml::tag_buffer(*it) > thumbnail_size_x_ > thumbnail_size_y_; + + g_engine->_thumbSizeX = thumbnail_size_x_; + g_engine->_thumbSizeY = thumbnail_size_y_; break; case QDSCR_INTERFACE_TEXT_SHIFT: xml::tag_buffer(*it) > text_dx_ > text_dy_; diff --git a/engines/qdengine/qdcore/qd_sprite.cpp b/engines/qdengine/qdcore/qd_sprite.cpp index 20e721faf74..294e613e068 100644 --- a/engines/qdengine/qdcore/qd_sprite.cpp +++ b/engines/qdengine/qdcore/qd_sprite.cpp @@ -22,6 +22,10 @@ #define FORBIDDEN_SYMBOL_ALLOW_ALL #include "common/debug.h" #include "common/file.h" +#include "common/savefile.h" + +#include "engines/metaengine.h" +#include "graphics/surface.h" #include "qdengine/qdengine.h" #include "qdengine/qd_precomp.h" @@ -202,6 +206,35 @@ bool qdSprite::load(const char *fname) { Common::SeekableReadStream *fh; Common::Path fpath(_file.c_str(), '\\'); + if (!strncmp(_file.c_str(), "save:", 5)) { + Common::InSaveFile *saveFile = g_engine->getSaveFileManager()->openForLoading(&_file.c_str()[5]); + + ExtendedSavegameHeader saveHeader; + if (MetaEngine::readSavegameHeader(saveFile, &saveHeader, true)) { + _size = _picture_size = Vect2i(qdGameConfig::get_config().screen_sx(), qdGameConfig::get_config().screen_sy()); + _picture_offset = Vect2i(0, 0); + + _format = GR_RGB565; + + _data = new unsigned char[_size.x * _size.y * 2]; + + for (int i = 0; i < _size.y; i++) { + uint16 *src = (uint16 *)saveHeader.thumbnail->getBasePtr(0, i); + uint16 *dst = (uint16 *)&_data[2 * _size.x * i]; + for (int j = 0; j < _size.x; j++) { + *dst++ = *src++; + } + } + + scale(static_cast(g_engine->_thumbSizeX) / _size.x, + static_cast(g_engine->_thumbSizeY) / _size.y); + } + + delete saveFile; + + return true; + } + if (!qdFileManager::instance().open_file(&fh, fpath.toString().c_str())) { return false; } diff --git a/engines/qdengine/qdengine.h b/engines/qdengine/qdengine.h index ee50c489e6d..bb11da3aab9 100644 --- a/engines/qdengine/qdengine.h +++ b/engines/qdengine/qdengine.h @@ -101,6 +101,8 @@ public: Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave = false) override; Common::Error loadGameStream(Common::SeekableReadStream *stream) override; + + int _thumbSizeX = 0, _thumbSizeY = 0; }; extern QDEngineEngine *g_engine;