miniz_oxide/deflate/
zlib.rs1use crate::deflate::core::deflate_flags::{TDEFL_GREEDY_PARSING_FLAG, TDEFL_RLE_MATCHES};
2
3const DEFAULT_CM: u8 = 8;
4const _DEFAULT_CINFO: u8 = 7 << 4;
5const _DEFAULT_FDICT: u8 = 0;
6const _DEFAULT_CMF: u8 = DEFAULT_CM | _DEFAULT_CINFO;
7const _MIN_CMF: u8 = DEFAULT_CM; const FCHECK_DIVISOR: u8 = 31;
12
13#[inline]
17fn add_fcheck(cmf: u8, flg: u8) -> u8 {
18 let rem = ((usize::from(cmf) * 256) + usize::from(flg)) % usize::from(FCHECK_DIVISOR);
19
20 let flg = flg & 0b11100000;
22
23 flg + (FCHECK_DIVISOR - rem as u8)
26}
27
28#[inline]
29const fn zlib_level_from_flags(flags: u32) -> u8 {
30 use crate::deflate::core::NUM_PROBES;
31
32 let num_probes = flags & super::MAX_PROBES_MASK;
33 if (flags & TDEFL_GREEDY_PARSING_FLAG != 0) || (flags & TDEFL_RLE_MATCHES != 0) {
34 if num_probes <= 1 {
35 0
36 } else {
37 1
38 }
39 } else if num_probes >= NUM_PROBES[9] as u32 {
40 3
41 } else {
42 2
43 }
44}
45
46#[inline]
49fn header_from_level(level: u8, window_bits: u8) -> [u8; 2] {
50 let cmf = DEFAULT_CM | (window_bits.saturating_sub(8) << 4);
53 [cmf, add_fcheck(cmf, level << 6)]
54}
55
56#[inline]
59pub fn header_from_flags(flags: u32, window_bits: u8) -> [u8; 2] {
60 let level = zlib_level_from_flags(flags);
61 header_from_level(level, window_bits)
62}
63
64#[cfg(test)]
65mod test {
66 use crate::shared::MZ_DEFAULT_WINDOW_BITS;
67 #[test]
68 fn zlib() {
69 use super::super::*;
70 use super::*;
71
72 let test_level = |level, expected| {
73 let flags = create_comp_flags_from_zip_params(
74 level,
75 MZ_DEFAULT_WINDOW_BITS,
76 CompressionStrategy::Default as i32,
77 );
78 assert_eq!(zlib_level_from_flags(flags), expected);
79 };
80
81 assert_eq!(zlib_level_from_flags(DEFAULT_FLAGS), 2);
82 test_level(0, 0);
83 test_level(1, 0);
84 test_level(2, 1);
85 test_level(3, 1);
86 for i in 4..=8 {
87 test_level(i, 2)
88 }
89 test_level(9, 3);
90 test_level(10, 3);
91 }
92
93 #[test]
94 fn test_header() {
95 let header = super::header_from_level(3, 8);
96 assert_eq!(
97 ((usize::from(header[0]) * 256) + usize::from(header[1])) % 31,
98 0
99 );
100 }
101}