1use super::*;
2use crate::stream::*;
3use crate::tlg5_saver::save_tlg5;
4use std::io::{Seek, Write};
5
6#[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)?; 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}