mirror of https://github.com/OpenRCT2/OpenRCT2.git
Add zlib-based compression and decompression
This commit is contained in:
parent
d4864108a6
commit
753d430eaa
|
@ -46,12 +46,13 @@ endif (DISABLE_NETWORK)
|
|||
|
||||
option(STATIC "Create a static build.")
|
||||
|
||||
# Not required yet
|
||||
PKG_CHECK_MODULES(PNG libpng>=1.6)
|
||||
if (NOT PNG_FOUND)
|
||||
PKG_CHECK_MODULES(PNG REQUIRED libpng16)
|
||||
endif (NOT PNG_FOUND)
|
||||
|
||||
PKG_CHECK_MODULES(ZLIB REQUIRED zlib)
|
||||
|
||||
# Handle creating the rct2 text and data files on OS X and Linux
|
||||
# See details in src/openrct2.c:openrct2_setup_rct2_segment for how the values
|
||||
# were derived.
|
||||
|
@ -143,9 +144,9 @@ else (STATIC)
|
|||
endif (STATIC)
|
||||
|
||||
if (STATIC)
|
||||
SET(PNGLIBS ${PNG_STATIC_LIBRARIES})
|
||||
SET(REQUIREDLIBS ${PNG_STATIC_LIBRARIES} ${ZLIB_STATIC_LIBRARIES})
|
||||
else (STATIC)
|
||||
SET(PNGLIBS ${PNG_LIBRARIES})
|
||||
SET(REQUIREDLIBS ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
|
||||
endif (STATIC)
|
||||
|
||||
if (NOT DISABLE_HTTP_TWITCH)
|
||||
|
@ -178,9 +179,9 @@ if (UNIX)
|
|||
set(DLLIB dl)
|
||||
endif (UNIX)
|
||||
|
||||
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS})
|
||||
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS})
|
||||
|
||||
LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS} ${PNG_LIBRARY_DIRS})
|
||||
LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS} ${PNG_LIBRARY_DIRS} ${ZLIB_LIBRARY_DIRS})
|
||||
|
||||
if (WIN32)
|
||||
# build as library for now, replace with add_executable
|
||||
|
@ -213,7 +214,7 @@ endif (UNIX AND NOT APPLE)
|
|||
# libopenrct2.dll -> openrct2.dll
|
||||
set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
||||
|
||||
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2LIBS} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${PNGLIBS})
|
||||
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2LIBS} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${REQUIREDLIBS})
|
||||
|
||||
if (APPLE OR STATIC)
|
||||
FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
|
||||
|
|
|
@ -320,14 +320,14 @@
|
|||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>$(SolutionDir)lib\include;$(SolutionDir)lib\include\libspeex;$(SolutionDir)lib\include\sdl;$(SolutionDir)lib\include\jansson;$(SolutionDir)lib\include\sdl_ttf;$(SolutionDir)lib\include\libpng;$(IncludePath)</IncludePath>
|
||||
<IncludePath>$(SolutionDir)lib\include;$(SolutionDir)lib\include\libspeex;$(SolutionDir)lib\include\sdl;$(SolutionDir)lib\include\jansson;$(SolutionDir)lib\include\sdl_ttf;$(SolutionDir)lib\include\libpng;$(SolutionDir)lib\include\zlib;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)lib;$(LibraryPath)</LibraryPath>
|
||||
<OutDir>$(SolutionDir)bin\</OutDir>
|
||||
<IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<IncludePath>$(SolutionDir)lib\include;$(SolutionDir)lib\include\libspeex;$(SolutionDir)lib\include\sdl;$(SolutionDir)lib\include\jansson;$(SolutionDir)lib\include\sdl_ttf;$(SolutionDir)lib\include\libpng;$(IncludePath)</IncludePath>
|
||||
<IncludePath>$(SolutionDir)lib\include;$(SolutionDir)lib\include\libspeex;$(SolutionDir)lib\include\sdl;$(SolutionDir)lib\include\jansson;$(SolutionDir)lib\include\sdl_ttf;$(SolutionDir)lib\include\libpng;$(SolutionDir)lib\include\zlib;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)lib;$(LibraryPath)</LibraryPath>
|
||||
<OutDir>$(SolutionDir)bin\</OutDir>
|
||||
<IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "util.h"
|
||||
#include <SDL.h>
|
||||
#include "../platform/platform.h"
|
||||
#include "zlib.h"
|
||||
|
||||
int squaredmetres_to_squaredfeet(int squaredMetres)
|
||||
{
|
||||
|
@ -313,3 +314,69 @@ uint32 util_rand() {
|
|||
srand3 = srand3 ^ (srand3 >> 19) ^ temp ^ (temp >> 8);
|
||||
return srand3;
|
||||
}
|
||||
|
||||
#define CHUNK 128*1024
|
||||
#define MAX_ZLIB_REALLOC 4*1024*1024
|
||||
|
||||
/**
|
||||
* @brief Inflates zlib-compressed data
|
||||
* @param data Data to be decompressed
|
||||
* @param data_in_size Size of data to be decompressed
|
||||
* @param data_out_size Pointer to a variable where output size will be written. If not 0, it will be used to set initial output buffer size.
|
||||
* @return Returns a pointer to memory holding decompressed data or NULL on failure.
|
||||
* @note It is caller's responsibility to free() the returned pointer once done with it.
|
||||
*/
|
||||
unsigned char *util_zlib_inflate(unsigned char *data, size_t data_in_size, size_t *data_out_size)
|
||||
{
|
||||
int ret = Z_OK;
|
||||
uLongf out_size = *data_out_size;
|
||||
if (out_size == 0)
|
||||
{
|
||||
// Try to guesstimate the size needed for output data by applying the
|
||||
// same ratio it would take to compress data_in_size.
|
||||
out_size = data_in_size * data_in_size / compressBound(data_in_size);
|
||||
out_size = min(MAX_ZLIB_REALLOC, out_size);
|
||||
}
|
||||
size_t buffer_size = out_size;
|
||||
unsigned char *buffer = malloc(buffer_size);
|
||||
do {
|
||||
if (ret == Z_BUF_ERROR)
|
||||
{
|
||||
buffer_size *= 2;
|
||||
out_size = buffer_size;
|
||||
buffer = realloc(buffer, buffer_size);
|
||||
}
|
||||
ret = uncompress(buffer, &out_size, data, data_in_size);
|
||||
} while (ret != Z_OK);
|
||||
buffer = realloc(buffer, out_size);
|
||||
*data_out_size = out_size;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Deflates input using zlib
|
||||
* @param data Data to be compressed
|
||||
* @param data_in_size Size of data to be compressed
|
||||
* @param data_out_size Pointer to a variable where output size will be written
|
||||
* @return Returns a pointer to memory holding compressed data or NULL on failure.
|
||||
* @note It is caller's responsibility to free() the returned pointer once done with it.
|
||||
*/
|
||||
unsigned char *util_zlib_deflate(unsigned char *data, size_t data_in_size, size_t *data_out_size)
|
||||
{
|
||||
int ret = Z_OK;
|
||||
uLongf out_size = *data_out_size;
|
||||
size_t buffer_size = compressBound(data_in_size);
|
||||
unsigned char *buffer = malloc(buffer_size);
|
||||
do {
|
||||
if (ret == Z_BUF_ERROR)
|
||||
{
|
||||
buffer_size *= 2;
|
||||
out_size = buffer_size;
|
||||
buffer = realloc(buffer, buffer_size);
|
||||
}
|
||||
ret = compress(buffer, &out_size, data, data_in_size);
|
||||
} while (ret != Z_OK);
|
||||
*data_out_size = out_size;
|
||||
buffer = realloc(buffer, *data_out_size);
|
||||
return buffer;
|
||||
}
|
||||
|
|
|
@ -52,4 +52,7 @@ bool str_is_null_or_empty(const char *str);
|
|||
void util_srand(int source);
|
||||
uint32 util_rand();
|
||||
|
||||
unsigned char *util_zlib_deflate(unsigned char *data, size_t data_in_size, size_t *data_out_size);
|
||||
unsigned char *util_zlib_inflate(unsigned char *data, size_t data_in_size, size_t *data_out_size);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue