]> wimlib.net Git - wimlib/blobdiff - include/wimlib.h
Use v1.8.0 as next version instead of v1.7.5
[wimlib] / include / wimlib.h
index 38ffc02460786f294a72a591cdf0dd6f5d5ed71b..70b1781facef4367a17b4390eba73830314f6ac9 100644 (file)
@@ -12,7 +12,7 @@
 /**
  * @mainpage
  *
- * This is the documentation for the library interface of wimlib 1.7.2, 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
 #define WIMLIB_MINOR_VERSION 7
 
 /** Patch version of the library (for example, the 5 in 1.2.5). */
-#define WIMLIB_PATCH_VERSION 2
+#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 <c>2^16</c>.
+        * up to and including <c>2^16</c>.
         */
        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 <c>2^21</c>.
+        * up to and including <c>2^21</c>.
         */
        WIMLIB_COMPRESSION_TYPE_LZX = 2,
 
@@ -511,13 +511,15 @@ enum wimlib_compression_type {
         * later.  Also, chunk sizes larger than <c>2^26</c> 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 <c>2^31 - 2</c>.
+        * up to and including <c>2^30</c>.
         */
        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 <b>not</b> 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
+ * 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
  * @{ */
@@ -3183,7 +3198,7 @@ wimlib_get_image_name(const WIMStruct *wim, int image);
  * bits contain the patch version.
  *
  * In other words, the returned value is equal to <code>((WIMLIB_MAJOR_VERSION
- * << 22) | (WIMLIB_MINOR_VERSION << 10) | WIMLIB_PATCH_VERSION)</code> for the
+ * << 20) | (WIMLIB_MINOR_VERSION << 10) | WIMLIB_PATCH_VERSION)</code> for the
  * corresponding header file.
  */
 extern uint32_t
@@ -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.
+ *     <br/>
+ *     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