mirror of https://github.com/OpenRCT2/OpenRCT2.git
Integrated fix of read chunk into main code
This commit is contained in:
parent
335aca4164
commit
72c1acf207
|
@ -24,7 +24,7 @@
|
|||
#include "rct2.h"
|
||||
#include "sawyercoding.h"
|
||||
|
||||
static int decode_chunk_rle(char *buffer, int length);
|
||||
static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length);
|
||||
static int decode_chunk_repeat(char *buffer, int length);
|
||||
static void decode_chunk_rotate(char *buffer, int length);
|
||||
|
||||
|
@ -68,91 +68,6 @@ int sawyercoding_validate_checksum(FILE *file)
|
|||
return checksum == fileChecksum;
|
||||
}
|
||||
|
||||
int decode_chunk_rle_variable(uint8 *src_buffer, uint8** dst_buffer, int src_length);
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0067685F
|
||||
* buffer (esi)
|
||||
* this is a temp function
|
||||
*/
|
||||
int sawyercoding_read_chunk_variable(FILE *file, uint8 **dst_buffer)
|
||||
{
|
||||
sawyercoding_chunk_header chunkHeader;
|
||||
|
||||
// Read chunk header
|
||||
if (fread(&chunkHeader, sizeof(sawyercoding_chunk_header), 1, file) != 1) {
|
||||
RCT2_ERROR("Unable to read chunk header!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8* src_buffer = malloc(chunkHeader.length);
|
||||
// Read chunk data
|
||||
if (fread(src_buffer, chunkHeader.length, 1, file) != 1) {
|
||||
free(src_buffer);
|
||||
RCT2_ERROR("Unable to read chunk data!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// Decode chunk data
|
||||
switch (chunkHeader.encoding) {
|
||||
case CHUNK_ENCODING_RLE:
|
||||
chunkHeader.length = decode_chunk_rle_variable(src_buffer, dst_buffer, chunkHeader.length);
|
||||
break;
|
||||
case CHUNK_ENCODING_ROTATE:
|
||||
decode_chunk_rotate(src_buffer, chunkHeader.length);
|
||||
memcpy(*dst_buffer, src_buffer, chunkHeader.length);
|
||||
break;
|
||||
case CHUNK_ENCODING_RLECOMPRESSED:
|
||||
chunkHeader.length = decode_chunk_rle_variable(src_buffer, dst_buffer, chunkHeader.length);
|
||||
chunkHeader.length = decode_chunk_repeat(*dst_buffer, chunkHeader.length);
|
||||
break;
|
||||
case 0:
|
||||
memcpy(*dst_buffer, src_buffer, chunkHeader.length);
|
||||
break;
|
||||
default:
|
||||
// For now this is temp function
|
||||
free(src_buffer);
|
||||
RCT2_ERROR("Unable to read chunk data!");
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
|
||||
free(src_buffer);
|
||||
// Set length
|
||||
RCT2_GLOBAL(0x009E3828, uint32) = chunkHeader.length;
|
||||
return chunkHeader.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Temp function
|
||||
* rct2: 0x0067693A
|
||||
*/
|
||||
int decode_chunk_rle_variable(uint8* src_buffer, uint8 **dst_buffer, int src_length)
|
||||
{
|
||||
int i, j, count;
|
||||
unsigned char *src, *dst, rleCodeByte;
|
||||
|
||||
src = src_buffer;
|
||||
dst = *dst_buffer;
|
||||
|
||||
for (i = 0; i < src_length; i++) {
|
||||
rleCodeByte = src[i];
|
||||
if (rleCodeByte & 128) {
|
||||
i++;
|
||||
count = 257 - rleCodeByte;
|
||||
for (j = 0; j < count; j++)
|
||||
*dst++ = src[i];
|
||||
}
|
||||
else {
|
||||
for (j = 0; j <= rleCodeByte; j++)
|
||||
*dst++ = src[++i];
|
||||
}
|
||||
}
|
||||
|
||||
// Return final size
|
||||
return dst - *dst_buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -169,26 +84,33 @@ int sawyercoding_read_chunk(FILE *file, uint8 *buffer)
|
|||
return -1;
|
||||
}
|
||||
|
||||
uint8* src_buffer = malloc(chunkHeader.length);
|
||||
|
||||
// Read chunk data
|
||||
if (fread(buffer, chunkHeader.length, 1, file) != 1) {
|
||||
if (fread(src_buffer, chunkHeader.length, 1, file) != 1) {
|
||||
free(src_buffer);
|
||||
RCT2_ERROR("Unable to read chunk data!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Decode chunk data
|
||||
switch (chunkHeader.encoding) {
|
||||
case CHUNK_ENCODING_NONE:
|
||||
memcpy(buffer, src_buffer, chunkHeader.length);
|
||||
break;
|
||||
case CHUNK_ENCODING_RLE:
|
||||
chunkHeader.length = decode_chunk_rle(buffer, chunkHeader.length);
|
||||
chunkHeader.length = decode_chunk_rle(src_buffer, buffer, chunkHeader.length);
|
||||
break;
|
||||
case CHUNK_ENCODING_RLECOMPRESSED:
|
||||
chunkHeader.length = decode_chunk_rle(buffer, chunkHeader.length);
|
||||
chunkHeader.length = decode_chunk_rle(src_buffer, buffer, chunkHeader.length);
|
||||
chunkHeader.length = decode_chunk_repeat(buffer, chunkHeader.length);
|
||||
break;
|
||||
case CHUNK_ENCODING_ROTATE:
|
||||
memcpy(buffer, src_buffer, chunkHeader.length);
|
||||
decode_chunk_rotate(buffer, chunkHeader.length);
|
||||
break;
|
||||
}
|
||||
|
||||
free(src_buffer);
|
||||
// Set length
|
||||
RCT2_GLOBAL(0x009E3828, uint32) = chunkHeader.length;
|
||||
return chunkHeader.length;
|
||||
|
@ -198,32 +120,26 @@ int sawyercoding_read_chunk(FILE *file, uint8 *buffer)
|
|||
*
|
||||
* rct2: 0x0067693A
|
||||
*/
|
||||
static int decode_chunk_rle(char *buffer, int length)
|
||||
static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length)
|
||||
{
|
||||
int i, j, count;
|
||||
unsigned char *src, *dst, rleCodeByte;
|
||||
uint8 *dst, rleCodeByte;
|
||||
|
||||
// Backup buffer
|
||||
src = malloc(length);
|
||||
memcpy(src, buffer, length);
|
||||
dst = buffer;
|
||||
dst = dst_buffer;
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
rleCodeByte = src[i];
|
||||
rleCodeByte = src_buffer[i];
|
||||
if (rleCodeByte & 128) {
|
||||
i++;
|
||||
count = 257 - rleCodeByte;
|
||||
for (j = 0; j < count; j++)
|
||||
*dst++ = src[i];
|
||||
*dst++ = src_buffer[i];
|
||||
} else {
|
||||
for (j = 0; j <= rleCodeByte; j++)
|
||||
*dst++ = src[++i];
|
||||
*dst++ = src_buffer[++i];
|
||||
}
|
||||
}
|
||||
|
||||
// Free backup buffer
|
||||
free(src);
|
||||
|
||||
// Return final size
|
||||
return (char*)dst - buffer;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue