/** * Thread-safe abstract compression routine. Compresses memory from uncompressed buffer and writes it to compressed * buffer. Updates CompressedSize with size of compressed data. Compression controlled by the passed in flags. * * @param Flags Flags to control what method to use and optionally control memory vs speed * @param CompressedBuffer Buffer compressed data is going to be written to * @param CompressedSize [in/out] Size of CompressedBuffer, at exit will be size of compressed data * @param UncompressedBuffer Buffer containing uncompressed data * @param UncompressedSize Size of uncompressed data in bytes * @return true if compression succeeds, false if it fails because CompressedBuffer was too small or other reasons */ bool FCompression::CompressMemory( ECompressionFlags Flags, void* CompressedBuffer, int32& CompressedSize, const void* UncompressedBuffer, int32 UncompressedSize ) { double CompressorStartTime = FPlatformTime::Seconds(); // make sure a valid compression scheme was provided check(Flags & COMPRESS_ZLIB || Flags & COMPRESS_GZIP); bool bCompressSucceeded = false; Flags = CheckGlobalCompressionFlags(Flags); switch(Flags & COMPRESSION_FLAGS_TYPE_MASK) { case COMPRESS_ZLIB: bCompressSucceeded = appCompressMemoryZLIB(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize); break; case COMPRESS_GZIP: bCompressSucceeded = appCompressMemoryGZIP(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize); break; default: UE_LOG(LogCompression, Warning, TEXT("appCompressMemory - This compression type not supported")); bCompressSucceeded = false; } // Keep track of compression time and stats. CompressorTime += FPlatformTime::Seconds() - CompressorStartTime; if( bCompressSucceeded ) { CompressorSrcBytes += UncompressedSize; CompressorDstBytes += CompressedSize; } return bCompressSucceeded; }
/** * Thread-safe abstract compression routine. Compresses memory from uncompressed buffer and writes it to compressed * buffer. Updates CompressedSize with size of compressed data. Compression controlled by the passed in flags. * * @param Flags Flags to control what method to use and optionally control memory vs speed * @param CompressedBuffer Buffer compressed data is going to be written to * @param CompressedSize [in/out] Size of CompressedBuffer, at exit will be size of compressed data * @param UncompressedBuffer Buffer containing uncompressed data * @param UncompressedSize Size of uncompressed data in bytes * @return true if compression succeeds, false if it fails because CompressedBuffer was too small or other reasons */ bool FCompression::CompressMemory( ECompressionFlags Flags, void* CompressedBuffer, int32& CompressedSize, const void* UncompressedBuffer, int32 UncompressedSize ) { double CompressorStartTime = FPlatformTime::Seconds(); // make sure a valid compression scheme was provided check(Flags & COMPRESS_ZLIB); bool bCompressSucceeded = false; static bool GAlwaysBiasCompressionForSize = false; if (FPlatformProperties::HasEditorOnlyData()) { static bool GTestedCmdLine = false; if (!GTestedCmdLine && FCommandLine::IsInitialized()) { GTestedCmdLine = true; // Override compression settings wrt size. GAlwaysBiasCompressionForSize = FParse::Param( FCommandLine::Get(), TEXT("BIASCOMPRESSIONFORSIZE") ); } } // Always bias for speed if option is set. if( GAlwaysBiasCompressionForSize ) { int32 NewFlags = Flags; NewFlags &= ~COMPRESS_BiasSpeed; NewFlags |= COMPRESS_BiasMemory; Flags = (ECompressionFlags) NewFlags; } switch(Flags & COMPRESSION_FLAGS_TYPE_MASK) { case COMPRESS_ZLIB: bCompressSucceeded = appCompressMemoryZLIB(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize); break; default: UE_LOG(LogCompression, Warning, TEXT("appCompressMemory - This compression type not supported")); bCompressSucceeded = false; } // Keep track of compression time and stats. CompressorTime += FPlatformTime::Seconds() - CompressorStartTime; if( bCompressSucceeded ) { CompressorSrcBytes += UncompressedSize; CompressorDstBytes += CompressedSize; } return bCompressSucceeded; }