/rust/registry/src/index.crates.io-1949cf8c6b5b557f/exr-1.73.0/src/compression/zip.rs
Line | Count | Source |
1 | | |
2 | | // see https://github.com/openexr/openexr/blob/master/OpenEXR/IlmImf/ImfCompressor.cpp |
3 | | |
4 | | |
5 | | use super::*; |
6 | | use super::optimize_bytes::*; |
7 | | use crate::error::Result; |
8 | | |
9 | | // scanline decompression routine, see https://github.com/openexr/openexr/blob/master/OpenEXR/IlmImf/ImfScanLineInputFile.cpp |
10 | | // 1. Uncompress the data, if necessary (If the line is uncompressed, it's in XDR format, regardless of the compressor's output format.) |
11 | | // 3. Convert one scan line's worth of pixel data back from the machine-independent representation |
12 | | // 4. Fill the frame buffer with pixel data, respective to sampling and whatnot |
13 | | |
14 | | |
15 | 9 | pub fn decompress_bytes( |
16 | 9 | channels: &ChannelList, |
17 | 9 | data: ByteVec, |
18 | 9 | rectangle: IntegerBounds, |
19 | 9 | expected_byte_size: usize, |
20 | 9 | _pedantic: bool, |
21 | 9 | ) -> Result<ByteVec> { |
22 | 9 | let options = zune_inflate::DeflateOptions::default().set_limit(expected_byte_size).set_size_hint(expected_byte_size); |
23 | 9 | let mut decoder = zune_inflate::DeflateDecoder::new_with_options(&data, options); |
24 | 9 | let mut decompressed = decoder.decode_zlib() |
25 | 9 | .map_err(|_| Error::invalid("zlib-compressed data malformed"))?; |
26 | | |
27 | 0 | differences_to_samples(&mut decompressed); |
28 | 0 | interleave_byte_blocks(&mut decompressed); |
29 | | |
30 | 0 | Ok(super::convert_little_endian_to_current(decompressed, channels, rectangle))// TODO no alloc |
31 | 9 | } |
32 | | |
33 | 0 | pub fn compress_bytes(channels: &ChannelList, uncompressed: ByteVec, rectangle: IntegerBounds) -> Result<ByteVec> { |
34 | | // see https://github.com/AcademySoftwareFoundation/openexr/blob/3bd93f85bcb74c77255f28cdbb913fdbfbb39dfe/OpenEXR/IlmImf/ImfTiledOutputFile.cpp#L750-L842 |
35 | 0 | let mut packed = convert_current_to_little_endian(uncompressed, channels, rectangle); |
36 | | |
37 | 0 | separate_bytes_fragments(&mut packed); |
38 | 0 | samples_to_differences(&mut packed); |
39 | | |
40 | 0 | Ok(miniz_oxide::deflate::compress_to_vec_zlib(packed.as_slice(), 4)) |
41 | 0 | } |