X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=70b1781facef4367a17b4390eba73830314f6ac9;hp=e27de4470d47ddbb7c836842242ab81ac2c43346;hb=7ede26591f8fc14b94b40ad079d4e0d2824efaff;hpb=c934009688f1860215c43bc115cbb02f914e9bb9 diff --git a/include/wimlib.h b/include/wimlib.h index e27de447..70b1781f 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -12,7 +12,7 @@ /** * @mainpage * - * This is the documentation for the library interface of wimlib 1.7.3, a C + * This is the documentation for the library interface of wimlib 1.7.4, a C * library for creating, modifying, extracting, and mounting files in the * Windows Imaging Format. This documentation is intended for developers only. * If you have installed wimlib and want to know how to use the @b wimlib-imagex @@ -379,7 +379,7 @@ #define WIMLIB_MINOR_VERSION 7 /** Patch version of the library (for example, the 5 in 1.2.5). */ -#define WIMLIB_PATCH_VERSION 3 +#define WIMLIB_PATCH_VERSION 4 #ifdef __cplusplus extern "C" { @@ -474,7 +474,7 @@ enum wimlib_compression_type { * * If using wimlib_create_compressor() to create an XPRESS compressor * directly, the @p max_block_size parameter may be any positive value - * up to 2^16. + * up to and including 2^16. */ WIMLIB_COMPRESSION_TYPE_XPRESS = 1, @@ -496,7 +496,7 @@ enum wimlib_compression_type { * * If using wimlib_create_compressor() to create an LZX compressor * directly, the @p max_block_size parameter may be any positive value - * up to 2^21. + * up to and including 2^21. */ WIMLIB_COMPRESSION_TYPE_LZX = 2, @@ -511,13 +511,15 @@ enum wimlib_compression_type { * later. Also, chunk sizes larger than 2^26 are not compatible * with the Microsoft implementation. * - * wimlib's LZMS compressor is currently faster but will usually not - * compress as much as the implementation in Microsoft's WIMGAPI - * (Windows 8.1). + * wimlib's LZMS compressor will, with the default settings, usually + * produce a better compression ratio, and work more quickly, than the + * implementation in Microsoft's WIMGAPI (as of Windows 8.1). There is + * limited support for non-default compression levels, but compression + * will be noticably faster if you choose a level < 35. * * If using wimlib_create_compressor() to create an LZMS compressor * directly, the @p max_block_size parameter may be any positive value - * up to 2^31 - 2. + * up to and including 2^30. */ WIMLIB_COMPRESSION_TYPE_LZMS = 3, }; @@ -1392,7 +1394,7 @@ struct wimlib_wim_info { }; /** Information about a unique stream in the WIM file. (A stream is the same - * thing as a "resource", except in the case of packed resources.) */ + * thing as a "resource", except in the case of solid resources.) */ struct wimlib_resource_entry { /** Uncompressed size of the stream in bytes. */ uint64_t uncompressed_size; @@ -1404,7 +1406,7 @@ struct wimlib_resource_entry { /** Offset, in bytes, of this stream from the start of the WIM file. Or * if @p packed is 1, then this is actually the offset at which this - * stream begins in the uncompressed contents of the packed resource. + * stream begins in the uncompressed contents of the solid resource. */ uint64_t offset; @@ -1433,18 +1435,18 @@ struct wimlib_resource_entry { * */ uint32_t is_missing : 1; - /** 1 if this stream is located in a packed resource which may contain + /** 1 if this stream is located in a solid resource which may contain * other streams (all compressed together) as well. */ uint32_t packed : 1; uint32_t reserved_flags : 26; - /** If @p packed is 1, then this will specify the offset of the packed + /** If @p packed is 1, then this will specify the offset of the solid * resource in the WIM. */ uint64_t raw_resource_offset_in_wim; /** If @p packed is 1, then this will specify the compressed size of the - * packed resource in the WIM. */ + * solid resource in the WIM. */ uint64_t raw_resource_compressed_size; uint64_t reserved[2]; @@ -2119,10 +2121,10 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * wimlib_set_default_compression_level() can be called beforehand to set an * even higher compression level than the default. * - * If the WIM contains solid blocks, then ::WIMLIB_WRITE_FLAG_RECOMPRESS can be - * used in combination with ::WIMLIB_WRITE_FLAG_PACK_STREAMS to prevent any - * solid blocks from being re-used. Otherwise, solid blocks are re-used - * somewhat more liberally than normal compressed blocks. + * If the WIM contains solid resources, then ::WIMLIB_WRITE_FLAG_RECOMPRESS can + * be used in combination with ::WIMLIB_WRITE_FLAG_SOLID to prevent any solid + * resources from being re-used. Otherwise, solid resources are re-used + * somewhat more liberally than normal compressed resources. * * ::WIMLIB_WRITE_FLAG_RECOMPRESS does not cause recompression of streams * that would not otherwise be written. For example, a call to @@ -2216,8 +2218,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour #define WIMLIB_WRITE_FLAG_RETAIN_GUID 0x00000800 /** - * When writing streams in the resulting WIM file, pack multiple streams into a - * single compressed resource instead of compressing them independently. This + * When writing streams in the resulting WIM file, combine multiple streams into + * a single compressed resource instead of compressing them independently. This * is also known as creating a "solid archive". This tends to produce a better * compression ratio at the cost of much slower random access. * @@ -2231,23 +2233,29 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * ::WIMLIB_WRITE_FLAG_RECOMPRESS to force the entire WIM file be rebuilt with * all streams recompressed in solid mode. * - * Currently, new solid blocks will, by default, be written using LZMS - * compression with 32 MiB (33554432 byte) chunks. Use + * Currently, new solid resources will, by default, be written using LZMS + * compression with 64 MiB (67108864 byte) chunks. Use * wimlib_set_output_pack_compression_type() and/or * wimlib_set_output_pack_chunk_size() to change this. This is independent of * the WIM's main compression type and chunk size; you can have a WIM that * nominally uses LZX compression and 32768 byte chunks but actually contains - * LZMS-compressed solid blocks, for example. However, if including solid + * LZMS-compressed solid resources, for example. However, if including solid * blocks, I suggest that you set the WIM's main compression type to LZMS as * well, either by creating the WIM with * ::wimlib_create_new_wim(::WIMLIB_COMPRESSION_TYPE_LZMS, ...) or by calling * ::wimlib_set_output_compression_type(..., ::WIMLIB_COMPRESSION_TYPE_LZMS). * * This flag will be set by default when writing or overwriting a WIM file that - * either already contains packed streams, or has had packed streams exported + * either already contains solid resources, or has had solid resources exported * into it and the WIM's main compression type is LZMS. */ -#define WIMLIB_WRITE_FLAG_PACK_STREAMS 0x00001000 +#define WIMLIB_WRITE_FLAG_SOLID 0x00001000 + +/** + * Deprecated: this is the old name for ::WIMLIB_WRITE_FLAG_SOLID, retained for + * source compatibility. + */ +#define WIMLIB_WRITE_FLAG_PACK_STREAMS WIMLIB_WRITE_FLAG_SOLID /** * Send ::WIMLIB_PROGRESS_MSG_DONE_WITH_FILE messages while writing the WIM @@ -2256,6 +2264,13 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour */ #define WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES 0x00002000 +/** + * If using solid compression, do not sort the streams ("files") to compress by + * estimated content similarily. This flag only has an effect if + * ::WIMLIB_WRITE_FLAG_SOLID is also specified. + */ +#define WIMLIB_WRITE_FLAG_NO_SOLID_SORT 0x00004000 + /** @} */ /** @addtogroup G_general * @{ */ @@ -4031,7 +4046,7 @@ wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size); * @ingroup G_writing_and_overwriting_wims * * Similar to wimlib_set_output_chunk_size(), but set the chunk size for writing - * packed streams (solid blocks). + * solid resources. */ extern int wimlib_set_output_pack_chunk_size(WIMStruct *wim, uint32_t chunk_size); @@ -4062,7 +4077,7 @@ wimlib_set_output_compression_type(WIMStruct *wim, int ctype); * @ingroup G_writing_and_overwriting_wims * * Similar to wimlib_set_output_compression_type(), but set the compression type - * for writing packed streams (solid blocks). + * for writing solid resources. */ extern int wimlib_set_output_pack_compression_type(WIMStruct *wim, int ctype); @@ -4611,6 +4626,8 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, size_t max_block_size, unsigned int compression_level); +#define WIMLIB_COMPRESSOR_FLAG_DESTRUCTIVE 0x80000000 + /** * Allocate a compressor for the specified compression type using the specified * parameters. This function is part of wimlib's compression API; it is not @@ -4655,6 +4672,15 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, * The compression level does not affect the format of the compressed data. * Therefore, it is a compressor-only parameter and does not need to be * passed to the decompressor. + *
+ * Since wimlib v1.8.0, this parameter can be OR-ed with the flag + * ::WIMLIB_COMPRESSOR_FLAG_DESTRUCTIVE. This creates the compressor in a + * mode where it is allowed to modify the input buffer. Specifically, in + * this mode, if compression succeeds, the input buffer may have been + * modified, whereas if compression does not succeed the input buffer still + * may have been written to but will have been restored exactly to its + * original state. This mode is designed to save some memory when using + * large buffer sizes. * @param compressor_ret * A location into which to return the pointer to the allocated compressor. * The allocated compressor can be used for any number of calls to