1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-03 00:46:55 +02:00

fix_crash_loading_frames_from_def

This commit is contained in:
MichalZr6
2024-11-27 23:07:45 +01:00
parent 132500b292
commit 5fc61df717
6 changed files with 61 additions and 12 deletions

View File

@ -38,7 +38,8 @@ enum class DefType : uint32_t
CDefFile::CDefFile(const AnimationPath & Name):
data(nullptr),
palette(nullptr)
palette(nullptr),
fileName(Name.getName())
{
data = CResourceHandler::get()->load(Name)->readAll().first;
@ -83,13 +84,12 @@ CDefFile::CDefFile(const AnimationPath & Name):
void CDefFile::loadFrame(size_t frame, size_t group, IImageLoader &loader) const
{
std::map<size_t, std::vector <size_t> >::const_iterator it;
it = offset.find(group);
assert (it != offset.end());
assert(hasFrame(frame, group)); // hasFrame() should be called before calling loadFrame()
const ui8 * FDef = data.get() + offset.at(group)[frame];
const ui8 * FDef = data.get()+it->second[frame];
const SSpriteDef sd = *reinterpret_cast<const SSpriteDef *>(FDef);
const SSpriteDef sd = * reinterpret_cast<const SSpriteDef *>(FDef);
SSpriteDef sprite;
sprite.format = read_le_u32(&sd.format);
@ -227,6 +227,23 @@ void CDefFile::loadFrame(size_t frame, size_t group, IImageLoader &loader) const
logGlobal->error("Error: unsupported format of def file: %d", sprite.format);
break;
}
}
bool CDefFile::hasFrame(size_t frame, size_t group) const
{
std::map<size_t, std::vector <size_t> >::const_iterator it;
it = offset.find(group);
if(it == offset.end())
{
return false;
}
if(frame >= it->second.size())
{
return false;
}
return true;
}
CDefFile::~CDefFile() = default;