Merge branch 'save_ext' into enhanced_viewport_overlay-sx
This commit is contained in:
@@ -566,7 +566,7 @@ void NORETURN SlError(StringID string, const char *extra_msg, bool already_mallo
|
||||
/**
|
||||
* As SlError, except that it takes a format string and additional parameters
|
||||
*/
|
||||
void CDECL NORETURN SlErrorFmt(StringID string, const char *msg, ...)
|
||||
void NORETURN CDECL SlErrorFmt(StringID string, const char *msg, ...)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, msg);
|
||||
@@ -590,7 +590,7 @@ void NORETURN SlErrorCorrupt(const char *msg, bool already_malloced)
|
||||
/**
|
||||
* As SlErrorCorruptFmt, except that it takes a format string and additional parameters
|
||||
*/
|
||||
void CDECL NORETURN SlErrorCorruptFmt(const char *msg, ...)
|
||||
void NORETURN CDECL SlErrorCorruptFmt(const char *msg, ...)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, msg);
|
||||
@@ -890,9 +890,20 @@ void SlSetLength(size_t length)
|
||||
case CH_RIFF:
|
||||
/* Ugly encoding of >16M RIFF chunks
|
||||
* The lower 24 bits are normal
|
||||
* The uppermost 4 bits are bits 24:27 */
|
||||
assert(length < (1 << 28));
|
||||
* The uppermost 4 bits are bits 24:27
|
||||
*
|
||||
* If we have more than 28 bits, use an extra uint32 and
|
||||
* signal this using the extended chunk header */
|
||||
assert(length < (1LL << 32));
|
||||
if (length >= (1 << 28)) {
|
||||
/* write out extended chunk header */
|
||||
SlWriteByte(CH_EXT_HDR);
|
||||
SlWriteUint32(static_cast<uint32>(SLCEHF_BIG_RIFF));
|
||||
}
|
||||
SlWriteUint32((uint32)((length & 0xFFFFFF) | ((length >> 24) << 28)));
|
||||
if (length >= (1 << 28)) {
|
||||
SlWriteUint32(length >> 28);
|
||||
}
|
||||
break;
|
||||
case CH_ARRAY:
|
||||
assert(_sl.last_array_index <= _sl.array_index);
|
||||
@@ -1663,6 +1674,16 @@ void SlAutolength(AutolengthProc *proc, void *arg)
|
||||
if (offs != _sl.dumper->GetSize()) SlErrorCorrupt("Invalid chunk size");
|
||||
}
|
||||
|
||||
/*
|
||||
* Notes on extended chunk header:
|
||||
*
|
||||
* If the chunk type is CH_EXT_HDR (15), then a u32 flags field follows.
|
||||
* This flag field may define additional fields which follow the flags field in future.
|
||||
* The standard chunk header follows, though it my be modified by the flags field.
|
||||
* At present SLCEHF_BIG_RIFF increases the RIFF size limit to a theoretical 60 bits,
|
||||
* by adding a further u32 field for the high bits after the existing RIFF size field.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Load a chunk of data (eg vehicles, stations, etc.)
|
||||
* @param ch The chunkhandler that will be used for the operation
|
||||
@@ -1676,6 +1697,15 @@ static void SlLoadChunk(const ChunkHandler *ch)
|
||||
_sl.block_mode = m;
|
||||
_sl.obj_len = 0;
|
||||
|
||||
SaveLoadChunkExtHeaderFlags ext_flags = static_cast<SaveLoadChunkExtHeaderFlags>(0);
|
||||
if ((m & 0xF) == CH_EXT_HDR) {
|
||||
ext_flags = static_cast<SaveLoadChunkExtHeaderFlags>(SlReadUint32());
|
||||
|
||||
/* read in real header */
|
||||
m = SlReadByte();
|
||||
_sl.block_mode = m;
|
||||
}
|
||||
|
||||
switch (m) {
|
||||
case CH_ARRAY:
|
||||
_sl.array_index = 0;
|
||||
@@ -1691,6 +1721,10 @@ static void SlLoadChunk(const ChunkHandler *ch)
|
||||
/* Read length */
|
||||
len = (SlReadByte() << 16) | ((m >> 4) << 24);
|
||||
len += SlReadUint16();
|
||||
if (ext_flags & SLCEHF_BIG_RIFF) {
|
||||
len |= SlReadUint32() << 28;
|
||||
}
|
||||
|
||||
_sl.obj_len = len;
|
||||
endoffs = _sl.reader->GetSize() + len;
|
||||
ch->load_proc();
|
||||
@@ -1716,9 +1750,21 @@ static void SlLoadCheckChunk(const ChunkHandler *ch)
|
||||
_sl.block_mode = m;
|
||||
_sl.obj_len = 0;
|
||||
|
||||
SaveLoadChunkExtHeaderFlags ext_flags = static_cast<SaveLoadChunkExtHeaderFlags>(0);
|
||||
if ((m & 0xF) == CH_EXT_HDR) {
|
||||
ext_flags = static_cast<SaveLoadChunkExtHeaderFlags>(SlReadUint32());
|
||||
|
||||
/* read in real header */
|
||||
m = SlReadByte();
|
||||
_sl.block_mode = m;
|
||||
}
|
||||
|
||||
switch (m) {
|
||||
case CH_ARRAY:
|
||||
_sl.array_index = 0;
|
||||
if (ext_flags) {
|
||||
SlErrorCorruptFmt("CH_ARRAY does not take chunk header extension flags: 0x%X", ext_flags);
|
||||
}
|
||||
if (ch && ch->load_check_proc) {
|
||||
ch->load_check_proc();
|
||||
} else {
|
||||
@@ -1726,6 +1772,9 @@ static void SlLoadCheckChunk(const ChunkHandler *ch)
|
||||
}
|
||||
break;
|
||||
case CH_SPARSE_ARRAY:
|
||||
if (ext_flags) {
|
||||
SlErrorCorruptFmt("CH_SPARSE_ARRAY does not take chunk header extension flags: 0x%X", ext_flags);
|
||||
}
|
||||
if (ch && ch->load_check_proc) {
|
||||
ch->load_check_proc();
|
||||
} else {
|
||||
@@ -1734,9 +1783,19 @@ static void SlLoadCheckChunk(const ChunkHandler *ch)
|
||||
break;
|
||||
default:
|
||||
if ((m & 0xF) == CH_RIFF) {
|
||||
if (ext_flags != (ext_flags & SLCEHF_BIG_RIFF)) {
|
||||
SlErrorCorruptFmt("Unknown chunk header extension flags for CH_RIFF: 0x%X", ext_flags);
|
||||
}
|
||||
/* Read length */
|
||||
len = (SlReadByte() << 16) | ((m >> 4) << 24);
|
||||
len += SlReadUint16();
|
||||
if (ext_flags & SLCEHF_BIG_RIFF) {
|
||||
uint64 full_len = len | (static_cast<uint64>(SlReadUint32()) << 28);
|
||||
if (full_len >= (1LL << 32)) {
|
||||
SlErrorCorrupt("Chunk size too large: " OTTD_PRINTFHEX64, full_len);
|
||||
}
|
||||
len = static_cast<size_t>(full_len);
|
||||
}
|
||||
_sl.obj_len = len;
|
||||
endoffs = _sl.reader->GetSize() + len;
|
||||
if (ch && ch->load_check_proc) {
|
||||
@@ -2469,8 +2528,6 @@ static inline void ClearSaveLoadState()
|
||||
|
||||
delete _sl.lf;
|
||||
_sl.lf = NULL;
|
||||
|
||||
SlXvSetCurrentState();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2782,6 +2839,8 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check)
|
||||
GamelogStopAction();
|
||||
}
|
||||
|
||||
SlXvSetCurrentState();
|
||||
|
||||
return SL_OK;
|
||||
}
|
||||
|
||||
@@ -2841,6 +2900,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo
|
||||
return SL_REINIT;
|
||||
}
|
||||
GamelogStopAction();
|
||||
SlXvSetCurrentState();
|
||||
return SL_OK;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user