mirror of
https://github.com/GabsPuNs/Project-Zenith-Main.git
synced 2026-06-09 03:22:39 +00:00
@@ -1,6 +1,16 @@
|
||||
#include "compression.h"
|
||||
#if defined __ORBIS__ || defined __PS3__ || defined _DURANGO || defined _WINDOWS64
|
||||
#include "..\Minecraft.Client\Common\Libs\zlib\inc\zlib.h"
|
||||
#endif
|
||||
#ifdef _WINDOWS64
|
||||
#include "..\Minecraft.Client\Windows64\Libs\zstd\inc\zstd.h"
|
||||
#endif
|
||||
#if defined __PSVITA__
|
||||
#include "..\Minecraft.Client\PSVita\PSVitaExtras\zlib.h"
|
||||
#elif defined __PS3__
|
||||
#include "..\Minecraft.Client\PS3\PS3Extras\EdgeZLib.h"
|
||||
#endif //__PS3__
|
||||
|
||||
|
||||
DWORD Compression::tlsIdx = 0;
|
||||
Compression::ThreadStorage *Compression::tlsDefault = nullptr;
|
||||
@@ -45,7 +55,7 @@ Compression *Compression::getCompression()
|
||||
return tls->compression;
|
||||
}
|
||||
|
||||
HRESULT Compression::CompressZSTDRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
HRESULT Compression::CompressLZXRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
{
|
||||
EnterCriticalSection(&rleCompressLock);
|
||||
//static unsigned char rleBuf[1024*100];
|
||||
@@ -114,7 +124,7 @@ HRESULT Compression::CompressZSTDRLE(void *pDestination, unsigned int *pDestSize
|
||||
PIXEndNamedEvent();
|
||||
|
||||
PIXBeginNamedEvent(0,"Secondary compression");
|
||||
Compression::Compress(pDestination, pDestSize, rleBuf, rleSize);
|
||||
Compress(pDestination, pDestSize, rleBuf, rleSize);
|
||||
PIXEndNamedEvent();
|
||||
|
||||
if(dynamicRleBuf != nullptr) delete [] dynamicRleBuf;
|
||||
@@ -211,7 +221,7 @@ HRESULT Compression::CompressRLE(void *pDestination, unsigned int *pDestSize, vo
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT Compression::DecompressZSTDRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
{
|
||||
EnterCriticalSection(&rleDecompressLock);
|
||||
// 4J Stu - Fix for #13676 - Crash: Crash while attempting to load a world after updating TU
|
||||
@@ -242,18 +252,18 @@ HRESULT Compression::DecompressZSTDRLE(void *pDestination, unsigned int *pDestSi
|
||||
{
|
||||
rleSize = safeRleSize;
|
||||
dynamicRleBuf = new unsigned char[rleSize];
|
||||
decompressResult = Compression::Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize);
|
||||
decompressResult = Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize);
|
||||
pucIn = (unsigned char *)dynamicRleBuf;
|
||||
}
|
||||
else
|
||||
{
|
||||
decompressResult = Compression::Decompress(rleDecompressBuf, &rleSize, pSource, SrcSize);
|
||||
decompressResult = Decompress(rleDecompressBuf, &rleSize, pSource, SrcSize);
|
||||
pucIn = static_cast<unsigned char*>(rleDecompressBuf);
|
||||
}
|
||||
|
||||
if(decompressResult != S_OK)
|
||||
{
|
||||
app.DebugPrintf("*** DecompressZSTDRLE: Decompress FAILED hr=0x%08X srcSize=%u expectedDest=%u rleSize=%u\n",
|
||||
app.DebugPrintf("*** DecompressLZXRLE: zlib Decompress FAILED hr=0x%08X srcSize=%u expectedDest=%u rleSize=%u\n",
|
||||
decompressResult, SrcSize, *pDestSize, rleSize);
|
||||
if(dynamicRleBuf != nullptr) delete [] dynamicRleBuf;
|
||||
*pDestSize = 0;
|
||||
@@ -379,9 +389,11 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize,
|
||||
|
||||
HRESULT Compression::Compress(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
{
|
||||
// ZSTD for Windows
|
||||
/*
|
||||
// Use zstd for Windows
|
||||
#ifdef _WINDOWS64
|
||||
size_t destSize = static_cast<size_t>(*pDestSize);
|
||||
const size_t res = ZSTD_compress(pDestination, destSize, pSource, SrcSize, 6);
|
||||
const size_t res = ZSTD_compress(pDestination, destSize, pSource, SrcSize, 3);
|
||||
|
||||
if (ZSTD_isError(res))
|
||||
return -1;
|
||||
@@ -389,65 +401,65 @@ HRESULT Compression::Compress(void *pDestination, unsigned int *pDestSize, void
|
||||
*pDestSize = static_cast<unsigned int>(res);
|
||||
|
||||
return S_OK;
|
||||
/*
|
||||
// ZLIB
|
||||
*/
|
||||
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
|
||||
#if defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ || defined _WINDOWS64
|
||||
SIZE_T destSize = (SIZE_T)(*pDestSize);
|
||||
const int res = ::compress(static_cast<Bytef *>(pDestination), (uLongf *)&destSize, static_cast<Bytef *>(pSource), SrcSize);
|
||||
*pDestSize = static_cast<unsigned int>(destSize);
|
||||
return ( ( res == Z_OK ) ? S_OK : -1 );
|
||||
|
||||
// PS3 a stubbed non-compressing version of ZLIB
|
||||
#elif defined __PS3__
|
||||
uint32_t destSize = (uint32_t)(*pDestSize);
|
||||
bool res = EdgeZLib::Compress(pDestination, &destSize, pSource, SrcSize);
|
||||
*pDestSize = (unsigned int)destSize;
|
||||
return ( ( res ) ? S_OK : -1 );
|
||||
|
||||
// 360 is using native 360 compression
|
||||
#else
|
||||
SIZE_T destSize = (SIZE_T)(*pDestSize);
|
||||
HRESULT res = XMemCompress(compressionContext, pDestination, &destSize, pSource, SrcSize);
|
||||
*pDestSize = (unsigned int)destSize;
|
||||
return res;
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
|
||||
HRESULT Compression::Decompress(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
|
||||
{
|
||||
|
||||
if(m_decompressType != m_localDecompressType) // check if we're decompressing data from a different platform
|
||||
{
|
||||
// only used for loading a save from a different platform (Sony cloud storage cross play)
|
||||
return DecompressWithType(pDestination, pDestSize, pSource, SrcSize);
|
||||
}
|
||||
|
||||
// ZSTD for Windows
|
||||
/*
|
||||
// Use zstd for Windows
|
||||
#ifdef _WINDOWS64
|
||||
size_t destSize = static_cast<size_t>(*pDestSize);
|
||||
const size_t res = ZSTD_decompress(pDestination, destSize, pSource, SrcSize);
|
||||
|
||||
if (ZSTD_isError(res))
|
||||
return -1;
|
||||
return -1;
|
||||
|
||||
*pDestSize = static_cast<unsigned int>(res);
|
||||
|
||||
return S_OK;
|
||||
/*
|
||||
// ZLIB
|
||||
*/
|
||||
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
|
||||
#if defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ || defined _WINDOWS64
|
||||
SIZE_T destSize = (SIZE_T)(*pDestSize);
|
||||
const int res = ::uncompress(static_cast<Bytef *>(pDestination), (uLongf *)&destSize, static_cast<Bytef *>(pSource), SrcSize);
|
||||
*pDestSize = static_cast<unsigned int>(destSize);
|
||||
return ( ( res == Z_OK ) ? S_OK : -1 );
|
||||
*/
|
||||
/*
|
||||
// PS3 a stubbed non-compressing version of ZLIB
|
||||
#elif defined __PS3__
|
||||
uint32_t destSize = (uint32_t)(*pDestSize);
|
||||
bool res = EdgeZLib::Decompress(pDestination, &destSize, pSource, SrcSize);
|
||||
*pDestSize = (unsigned int)destSize;
|
||||
return ( ( res ) ? S_OK : -1 );
|
||||
|
||||
// 360 is using native 360 compression
|
||||
#else
|
||||
SIZE_T destSize = (SIZE_T)(*pDestSize);
|
||||
HRESULT res = XMemDecompress(decompressionContext, pDestination, (SIZE_T *)&destSize, pSource, SrcSize);
|
||||
*pDestSize = (unsigned int)destSize;
|
||||
return res;
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
|
||||
// MGH - same as VirtualDecompress in PSVitaStubs, but for use on other platforms (so no virtual mem stuff)
|
||||
@@ -498,19 +510,27 @@ HRESULT Compression::DecompressWithType(void *pDestination, unsigned int *pDestS
|
||||
return S_OK;
|
||||
case eCompressionType_LZXRLE:
|
||||
{
|
||||
#if (defined _XBOX || defined _DURANGO || defined _WINDOWS64)
|
||||
SIZE_T destSize = (SIZE_T)(*pDestSize);
|
||||
const HRESULT res = XMemDecompress(decompressionContext, pDestination, (SIZE_T *)&destSize, pSource, SrcSize);
|
||||
*pDestSize = static_cast<unsigned int>(destSize);
|
||||
return res;
|
||||
#else
|
||||
assert(0);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case eCompressionType_ZLIBRLE:
|
||||
#if (defined __ORBIS__ || defined __PS3__ || defined _DURANGO || defined _WINDOWS64)
|
||||
if (pDestination != nullptr)
|
||||
return ::uncompress(static_cast<PBYTE>(pDestination), (unsigned long *) pDestSize, static_cast<PBYTE>(pSource), SrcSize); // Decompress
|
||||
else
|
||||
break; // Cannot decompress when destination is nullptr
|
||||
|
||||
else break; // Cannot decompress when destination is nullptr
|
||||
#else
|
||||
assert(0);
|
||||
break;
|
||||
#endif
|
||||
case eCompressionType_PS3ZLIB:
|
||||
#if (defined __ORBIS__ || defined __PSVITA__ || defined _DURANGO || defined _WINDOWS64)
|
||||
// Note that we're missing the normal zlib header and footer so we'll use inflate to
|
||||
// decompress the payload and skip all the CRC checking, etc
|
||||
if (pDestination != nullptr)
|
||||
@@ -562,20 +582,27 @@ HRESULT Compression::DecompressWithType(void *pDestination, unsigned int *pDestS
|
||||
delete uncompr.data;
|
||||
return S_OK;
|
||||
}
|
||||
else
|
||||
break; // Cannot decompress when destination is nullptr
|
||||
|
||||
else break; // Cannot decompress when destination is nullptr
|
||||
#else
|
||||
assert(0);
|
||||
#endif
|
||||
case eCompressionType_ZSTDRLE:
|
||||
#ifdef _WINDOWS64
|
||||
if (pDestination != nullptr)
|
||||
return ZSTD_decompress(static_cast<PBYTE>(pDestination), (SIZE_T)pDestSize, static_cast<PBYTE>(pSource), SrcSize);
|
||||
else
|
||||
break; // Cannot decompress when destination is nullptr
|
||||
else break; // Cannot decompress when destination is nullptr
|
||||
#else
|
||||
assert(0);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
assert(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Compression::Compression()
|
||||
{
|
||||
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
|
||||
@@ -591,10 +618,15 @@ Compression::Compression()
|
||||
XMemCreateDecompressionContext(XMEMCODEC_LZX,¶ms,0,&decompressionContext);
|
||||
#endif
|
||||
|
||||
//X360: eCompressionType_LZXRLE. PS3: eCompressionType_PS3ZLIB.
|
||||
//Other Consoles: eCompressionType_ZLIBRLE.
|
||||
m_localDecompressType = eCompressionType_ZSTDRLE;
|
||||
|
||||
#if defined _XBOX
|
||||
m_localDecompressType = eCompressionType_LZXRLE;
|
||||
#elif defined __PS3__
|
||||
m_localDecompressType = eCompressionType_PS3ZLIB;
|
||||
//#elif defined _WINDOWS64
|
||||
// m_localDecompressType = eCompressionType_ZSTDRLE;
|
||||
#else
|
||||
m_localDecompressType = eCompressionType_ZLIBRLE;
|
||||
#endif
|
||||
m_decompressType = m_localDecompressType;
|
||||
|
||||
InitializeCriticalSection(&rleCompressLock);
|
||||
@@ -612,6 +644,8 @@ Compression::~Compression()
|
||||
DeleteCriticalSection(&rleDecompressLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Compression::SetDecompressionType(ESavePlatform platform)
|
||||
{
|
||||
switch(platform)
|
||||
@@ -625,10 +659,11 @@ void Compression::SetDecompressionType(ESavePlatform platform)
|
||||
case SAVE_FILE_PLATFORM_XBONE:
|
||||
case SAVE_FILE_PLATFORM_PS4:
|
||||
case SAVE_FILE_PLATFORM_PSVITA:
|
||||
case SAVE_FILE_PLATFORM_WIN64:
|
||||
Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZLIBRLE);
|
||||
break;
|
||||
case SAVE_FILE_PLATFORM_WIN64:
|
||||
Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZSTDRLE);
|
||||
// case SAVE_FILE_PLATFORM_WIN64:
|
||||
// Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZSTDRLE);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
@@ -636,4 +671,6 @@ void Compression::SetDecompressionType(ESavePlatform platform)
|
||||
}
|
||||
}
|
||||
|
||||
/*Compression gCompression;*/
|
||||
/*Compression gCompression;*/
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user