Skip to main content

assetpack_transform_precomp2/
precomp2.rs

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