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