diff --git a/src/network/network.cpp b/src/network/network.cpp index df80dd74a5..20d217b90a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -28,6 +28,7 @@ extern "C" { #include "../openrct2.h" #include "../platform/platform.h" +#include "../util/sawyercoding.h" } #include "network.h" diff --git a/src/util/sawyercoding.c b/src/util/sawyercoding.c index 4db38ba8c9..d3c4b263dc 100644 --- a/src/util/sawyercoding.c +++ b/src/util/sawyercoding.c @@ -28,6 +28,8 @@ static size_t encode_chunk_rle(const uint8 *src_buffer, uint8 *dst_buffer, size_ static size_t encode_chunk_repeat(const uint8 *src_buffer, uint8 *dst_buffer, size_t length); static void encode_chunk_rotate(uint8 *buffer, size_t length); +bool gUseRLE = true; + uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length) { size_t i; @@ -138,24 +140,29 @@ size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const siz } // Decode chunk data + size_t data_size = sawyercoding_read_chunk_buffer(buffer, src_buffer, chunkHeader, buffer_size); + free(src_buffer); + return data_size; +} + +size_t sawyercoding_read_chunk_buffer(uint8 *dst_buffer, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader, size_t dst_buffer_size) { switch (chunkHeader.encoding) { case CHUNK_ENCODING_NONE: - assert(chunkHeader.length <= buffer_size); - memcpy(buffer, src_buffer, chunkHeader.length); + assert(chunkHeader.length <= dst_buffer_size); + memcpy(dst_buffer, src_buffer, chunkHeader.length); break; case CHUNK_ENCODING_RLE: - chunkHeader.length = (uint32)decode_chunk_rle_with_size(src_buffer, buffer, chunkHeader.length, buffer_size); + chunkHeader.length = (uint32)decode_chunk_rle_with_size(src_buffer, dst_buffer, chunkHeader.length, dst_buffer_size); break; case CHUNK_ENCODING_RLECOMPRESSED: - chunkHeader.length = (uint32)decode_chunk_rle_with_size(src_buffer, buffer, chunkHeader.length, buffer_size); - chunkHeader.length = (uint32)decode_chunk_repeat(buffer, chunkHeader.length); + chunkHeader.length = (uint32)decode_chunk_rle_with_size(src_buffer, dst_buffer, chunkHeader.length, dst_buffer_size); + chunkHeader.length = (uint32)decode_chunk_repeat(dst_buffer, chunkHeader.length); break; case CHUNK_ENCODING_ROTATE: - memcpy(buffer, src_buffer, chunkHeader.length); - decode_chunk_rotate(buffer, chunkHeader.length); + memcpy(dst_buffer, src_buffer, chunkHeader.length); + decode_chunk_rotate(dst_buffer, chunkHeader.length); break; } - free(src_buffer); return chunkHeader.length; } @@ -164,7 +171,7 @@ size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const siz * rct2: 0x006762E1 * */ -size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader){ +size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, const uint8* buffer, sawyercoding_chunk_header chunkHeader) { uint8 *encode_buffer, *encode_buffer2; if (gUseRLE == false) { diff --git a/src/util/sawyercoding.h b/src/util/sawyercoding.h index 8011312bd9..7551c07aac 100644 --- a/src/util/sawyercoding.h +++ b/src/util/sawyercoding.h @@ -28,6 +28,8 @@ typedef struct sawyercoding_chunk_header { assert_struct_size(sawyercoding_chunk_header, 5); #pragma pack(pop) +extern bool gUseRLE; + enum { CHUNK_ENCODING_NONE, CHUNK_ENCODING_RLE, @@ -52,7 +54,8 @@ uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length); bool sawyercoding_read_chunk_safe(SDL_RWops *rw, void *dst, size_t dstLength); bool sawyercoding_skip_chunk(SDL_RWops *rw); size_t sawyercoding_read_chunk_with_size(SDL_RWops* rw, uint8 *buffer, const size_t buffer_size); -size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader); +size_t sawyercoding_read_chunk_buffer(uint8 *dst_buffer, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader, size_t dst_buffer_size); +size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, const uint8 *src_buffer, sawyercoding_chunk_header chunkHeader); size_t sawyercoding_decode_sv4(const uint8 *src, uint8 *dst, size_t length, size_t bufferLength); size_t sawyercoding_decode_sc4(const uint8 *src, uint8 *dst, size_t length, size_t bufferLength); size_t sawyercoding_encode_sv4(const uint8 *src, uint8 *dst, size_t length); diff --git a/src/util/util.c b/src/util/util.c index c186ae8cad..98f9c760af 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -24,8 +24,6 @@ #include "util.h" #include "zlib.h" -bool gUseRLE = true; - int squaredmetres_to_squaredfeet(int squaredMetres) { // 1 metre squared = 10.7639104 feet squared diff --git a/src/util/util.h b/src/util/util.h index f6ffdc66f5..39ede842b1 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -19,8 +19,6 @@ #include "../common.h" -extern bool gUseRLE; - int squaredmetres_to_squaredfeet(int squaredMetres); int metres_to_feet(int metres); int mph_to_kmph(int mph);