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:
@ -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;
|
||||
|
Reference in New Issue
Block a user