libtlg_rs/
save_tlg.rs

1use super::*;
2use crate::stream::*;
3use crate::tlg5_saver::save_tlg5;
4use std::io::{Seek, Write};
5
6/// Encode TLG image
7#[cfg_attr(docsrs, doc(cfg(feature = "encode")))]
8pub fn save_tlg<W: Write + Seek>(img: &Tlg, mut writer: W) -> Result<()> {
9    let colors = match img.color {
10        TlgColorType::Bgra32 => 4,
11        TlgColorType::Bgr24 => 3,
12        TlgColorType::Grayscale8 => 1,
13    };
14    let img_size = img.width as usize * colors as usize * img.height as usize;
15    if img.data.len() < img_size {
16        return Err(TlgError::EncodeError(format!(
17            "Image data size too small: expected {}, got {}",
18            img_size,
19            img.data.len()
20        )));
21    }
22    if img.tags.is_empty() {
23        if img.version == 5 {
24            return save_tlg5(img, &mut writer);
25        } else {
26            return Err(TlgError::EncodeError(format!(
27                "Unsupported TLG version: {}",
28                img.version
29            )));
30        }
31    }
32    writer.write_all(b"TLG0.0\x00sds\x1a")?;
33    let rawlenpos = writer.stream_position()?;
34    writer.write_u32(0)?; // Placeholder for raw data length
35    if img.version == 5 {
36        save_tlg5(img, &mut writer)?;
37    } else {
38        return Err(TlgError::EncodeError(format!(
39            "Unsupported TLG version: {}",
40            img.version
41        )));
42    }
43    let pos_save = writer.stream_position()?;
44    writer.seek(std::io::SeekFrom::Start(rawlenpos))?;
45    let size = pos_save - rawlenpos - 4;
46    writer.write_u32(size as u32)?;
47    writer.seek(std::io::SeekFrom::Start(pos_save))?;
48    writer.write_all(b"tags")?;
49    let mut ss = Vec::new();
50    for (k, v) in &img.tags {
51        ss.write_all(k.len().to_string().as_bytes())?;
52        ss.write_all(b":")?;
53        ss.write_all(k)?;
54        ss.write_all(b"=")?;
55        ss.write_all(v.len().to_string().as_bytes())?;
56        ss.write_all(b":")?;
57        ss.write_all(v)?;
58        ss.write_all(b",")?;
59    }
60    writer.write_u32(ss.len() as u32)?;
61    writer.write_all(&ss)?;
62    Ok(())
63}