rakata_formats/tpc/
writer.rs1use std::io::{Cursor, Write};
4
5use super::{expected_payload_size, write_header, Tpc, TpcBinaryError};
6
7#[cfg_attr(
9 feature = "tracing",
10 tracing::instrument(
11 level = "debug",
12 skip(writer, tpc),
13 fields(pixel_type = tpc.header.pixel_type, mipmap_count = tpc.header.mipmap_count)
14 )
15)]
16pub fn write_tpc<W: Write>(writer: &mut W, tpc: &Tpc) -> Result<(), TpcBinaryError> {
17 let expected_payload_size = expected_payload_size(&tpc.header)?;
18 if expected_payload_size != tpc.payload.len() {
19 return Err(TpcBinaryError::InvalidData(format!(
20 "payload length mismatch: expected {expected_payload_size}, got {}",
21 tpc.payload.len()
22 )));
23 }
24
25 write_header(writer, &tpc.header)?;
26 writer.write_all(&tpc.payload)?;
27 writer.write_all(&tpc.txi_footer)?;
28 crate::trace_debug!(
29 payload_len = tpc.payload.len(),
30 txi_footer_len = tpc.txi_footer.len(),
31 "wrote tpc to writer"
32 );
33 Ok(())
34}
35
36#[cfg_attr(
38 feature = "tracing",
39 tracing::instrument(
40 level = "debug",
41 skip(tpc),
42 fields(pixel_type = tpc.header.pixel_type, mipmap_count = tpc.header.mipmap_count)
43 )
44)]
45pub fn write_tpc_to_vec(tpc: &Tpc) -> Result<Vec<u8>, TpcBinaryError> {
46 let mut cursor = Cursor::new(Vec::new());
47 write_tpc(&mut cursor, tpc)?;
48 let bytes = cursor.into_inner();
49 crate::trace_debug!(bytes_len = bytes.len(), "serialized tpc to vec");
50 Ok(bytes)
51}