]> wimlib.net Git - wimlib/blobdiff - include/wimlib/lzms.h
Update LZMS compressor - can now output literals
[wimlib] / include / wimlib / lzms.h
index a18c526e5dea05f25c2cf4c825de27c4d47b2d27..177ad548606b91daeb64fc6b85b507905fa121c8 100644 (file)
 #define LZMS_X86_MAX_GOOD_TARGET_OFFSET                65535
 #define LZMS_X86_MAX_TRANSLATION_OFFSET                1023
 
+/* Code shared between the LZMS decompressor and compressor.  */
+
 #include <wimlib/types.h>
 
 extern void
 lzms_x86_filter(u8 data[], s32 size, s32 last_target_usages[], bool undo);
 
+/* Probability entry for use by the range coder when in a specific state.  */
+struct lzms_probability_entry {
+
+       /* Number of zeroes in the most recent LZMS_PROBABILITY_MAX bits that
+        * have been coded using this probability entry.  This is a cached value
+        * because it can be computed as LZMS_PROBABILITY_MAX minus the Hamming
+        * weight of the low-order LZMS_PROBABILITY_MAX bits of @recent_bits.
+        * */
+       u32 num_recent_zero_bits;
+
+       /* The most recent LZMS_PROBABILITY_MAX bits that have been coded using
+        * this probability entry.  The size of this variable, in bits, must be
+        * at least LZMS_PROBABILITY_MAX.  */
+       u64 recent_bits;
+};
+
+extern u32 lzms_position_slot_base[LZMS_MAX_NUM_OFFSET_SYMS + 1];
+
+extern u32 lzms_length_slot_base[LZMS_NUM_LEN_SYMS + 1];
+
+extern void
+lzms_init_slot_bases(void);
+
+extern u32
+lzms_get_slot(u32 value, const u32 slot_base_tab[], unsigned num_slots);
+
+static inline u32
+lzms_get_position_slot(u32 value)
+{
+       return lzms_get_slot(value, lzms_position_slot_base,
+                            LZMS_MAX_NUM_OFFSET_SYMS);
+}
+
+static inline u32
+lzms_get_length_slot(u32 value)
+{
+       return lzms_get_slot(value, lzms_length_slot_base,
+                            LZMS_NUM_LEN_SYMS);
+}
+
 #endif /* _WIMLIB_LZMS_H  */