|
@@ -1,18 +1,74 @@
|
|
|
-use binrw::{BinRead, BinWrite, FilePtr64};
|
|
|
+use std::io::{Seek, SeekFrom, Write};
|
|
|
|
|
|
-use crate::{array_of::ArrayOf, layer::Layer, pen::PenHeader};
|
|
|
+use binrw::{BinRead, BinResult, BinWrite, BinWriterExt, Endian, FilePtr64};
|
|
|
+
|
|
|
+use crate::{
|
|
|
+ array_of::ArrayOf,
|
|
|
+ layer::{self, Layer},
|
|
|
+ pen::PenHeader,
|
|
|
+};
|
|
|
|
|
|
#[derive(BinRead, Debug)]
|
|
|
pub struct Header {
|
|
|
_magic: [u16; 8],
|
|
|
_unknown_1: [u8; 0x150],
|
|
|
- pub thumbnail: FilePtr64<Thumbnail>,
|
|
|
- pub pens: FilePtr64<PenHeader>,
|
|
|
- _unknown_offset: FilePtr64<()>,
|
|
|
- pub layers: FilePtr64<ArrayOf<Layer>>,
|
|
|
+ pub thumbnail_offset: FilePtr64<Thumbnail>,
|
|
|
+ pub pens_offset: FilePtr64<PenHeader>,
|
|
|
+ _unknown_offset: FilePtr64<Unknown>,
|
|
|
+ pub layers_offset: FilePtr64<ArrayOf<Layer>>,
|
|
|
_unknown_2: [u8; 0x1A8],
|
|
|
}
|
|
|
|
|
|
+impl BinWrite for Header {
|
|
|
+ type Args<'a> = ();
|
|
|
+
|
|
|
+ fn write_options<W: Write + Seek>(
|
|
|
+ &self,
|
|
|
+ writer: &mut W,
|
|
|
+ endian: Endian,
|
|
|
+ args: Self::Args<'_>,
|
|
|
+ ) -> BinResult<()> {
|
|
|
+ self._magic.write_options(writer, endian, args)?;
|
|
|
+ self._unknown_1.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ // Save address and write placeholder (zeros) for now
|
|
|
+ let thumbnail_save_offset: u64 = writer.stream_position().unwrap();
|
|
|
+ 0u64.write_options(writer, endian, args)?;
|
|
|
+ let pens_save_offset: u64 = writer.stream_position().unwrap();
|
|
|
+ 0u64.write_options(writer, endian, args)?;
|
|
|
+ let unknown_save_offset: u64 = writer.stream_position().unwrap();
|
|
|
+ 0u64.write_options(writer, endian, args)?;
|
|
|
+ let layers_save_offset: u64 = writer.stream_position().unwrap();
|
|
|
+ 0u64.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ self._unknown_2.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ let write_offset = |writer: &mut W, offset: u64| -> BinResult<()> {
|
|
|
+ let current_offset: u64 = writer.stream_position().unwrap();
|
|
|
+ writer.seek(SeekFrom::Start(offset)).unwrap();
|
|
|
+ writer.write_type(¤t_offset, endian)?;
|
|
|
+ writer.seek(SeekFrom::Start(current_offset)).unwrap();
|
|
|
+ Ok(())
|
|
|
+ };
|
|
|
+
|
|
|
+ // Write thumbnail contents
|
|
|
+ write_offset(writer, thumbnail_save_offset)?;
|
|
|
+ self.thumbnail_offset.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ // Write unknown contents
|
|
|
+ write_offset(writer, unknown_save_offset)?;
|
|
|
+ self._unknown_offset.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ // Write pens
|
|
|
+ write_offset(writer, pens_save_offset)?;
|
|
|
+ self.pens_offset.write_options(writer, endian, args)?;
|
|
|
+
|
|
|
+ // Write layers
|
|
|
+ write_offset(writer, layers_save_offset)?;
|
|
|
+ self.layers_offset.write_options(writer, endian, args)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[derive(BinRead, BinWrite, Debug)]
|
|
|
pub struct Thumbnail {
|
|
|
_zeros_1: u32,
|
|
@@ -26,3 +82,8 @@ pub struct Thumbnail {
|
|
|
// pub pixels: Vec<Rgba>, // Takes ~1s longer
|
|
|
pub pixels: Vec<u32>,
|
|
|
}
|
|
|
+
|
|
|
+#[derive(BinRead, BinWrite, Debug)]
|
|
|
+pub struct Unknown {
|
|
|
+ _zeros: u32,
|
|
|
+}
|