Skip to main content

assetpack_transform_precomp2/
precomp2_lzma.rs

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