assetpack_transform_precomp2/
precomp2_lzma.rs1use 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}