rakata_formats/tpc/
writer.rs

1//! TPC binary writer.
2
3use std::io::{Cursor, Write};
4
5use super::{expected_payload_size, write_header, Tpc, TpcBinaryError};
6
7/// Writes TPC data to a writer.
8#[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/// Serializes TPC data to a byte vector.
37#[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}