Skip to main content

assetpack_transform_precomp2/
precomp2.rs

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