Skip to main content

assetpack_transform_precomp2/
precomp2_lzma.rs

1use std::io::{BufRead, Write};
2
3use assetpack_core::file_transform::{
4  FileHint, FileTransform, FileTransformConfig, TRANSFORM_ID_PRECOMP2_LZMA, TRANSFORM_VERSION_PRECOMP2_LZMA, TransformStats,
5};
6
7use crate::common::{
8  TransformGate, clamp_dict_size, lzma_compress, lzma_decompress, precomp2_decode_bytes, precomp2_decode_config, precomp2_encode_bytes,
9  precomp2_encode_config, read_all,
10};
11
12#[derive(Debug, Clone)]
13pub struct Precomp2LzmaTransform {
14  gate: TransformGate,
15  encode_config: precomp2::EncodeConfig,
16  decode_config: precomp2::DecodeConfig,
17  preset: u32,
18  dict_size: u32,
19}
20
21impl Precomp2LzmaTransform {
22  pub fn new(config: &FileTransformConfig) -> Self {
23    Self {
24      gate: TransformGate::new(config),
25      encode_config: precomp2_encode_config(&config.precomp2),
26      decode_config: precomp2_decode_config(&config.precomp2),
27      preset: config.precomp2_lzma.preset as u32,
28      dict_size: clamp_dict_size(config.precomp2_lzma.dict_size),
29    }
30  }
31}
32
33impl FileTransform for Precomp2LzmaTransform {
34  fn id(&self) -> u16 {
35    TRANSFORM_ID_PRECOMP2_LZMA
36  }
37
38  fn version(&self) -> u16 {
39    TRANSFORM_VERSION_PRECOMP2_LZMA
40  }
41
42  fn quick_check(&self, hint: &FileHint) -> bool {
43    self.gate.quick_check(hint)
44  }
45
46  fn encode(&self, input: &mut dyn BufRead, out: &mut dyn Write) -> assetpack_core::Result<TransformStats> {
47    let input_bytes = read_all(input)?;
48    let input_len = input_bytes.len() as u64;
49    let encoded = precomp2_encode_bytes(&input_bytes, &self.encode_config)?;
50    let compressed = lzma_compress(&encoded, self.preset, self.dict_size)?;
51    out.write_all(&compressed)?;
52    Ok(TransformStats {
53      input_bytes: input_len,
54      output_bytes: compressed.len() as u64,
55    })
56  }
57
58  fn decode(&self, input: &mut dyn BufRead, out: &mut dyn Write) -> assetpack_core::Result<()> {
59    let encoded = read_all(input)?;
60    let decoded = lzma_decompress(&encoded, self.dict_size)?;
61    let output = precomp2_decode_bytes(&decoded, &self.decode_config)?;
62    out.write_all(&output)?;
63    Ok(())
64  }
65}