فهرست منبع

Refactor to use more magic values

Kevin Lee 1 سال پیش
والد
کامیت
43472cb2dd
4فایلهای تغییر یافته به همراه28 افزوده شده و 21 حذف شده
  1. 4 3
      src/ezcad/file.rs
  2. 22 15
      src/ezcad/layer.rs
  3. 1 2
      src/ezcad/pen.rs
  4. 1 1
      src/main.rs

+ 4 - 3
src/ezcad/file.rs

@@ -1,6 +1,6 @@
 use binrw::{BinRead, BinWrite, FilePtr64};
 
-use crate::{layer::LayerHeader, pen::PenHeader, types::Rgba};
+use crate::{layer::Layer, pen::PenHeader, types::Rgba, array_of::ArrayOf};
 
 #[derive(BinRead, Debug)]
 pub struct Header {
@@ -9,7 +9,7 @@ pub struct Header {
     pub thumbnail_offset: FilePtr64<Thumbnail>,
     pub pens_offset: FilePtr64<PenHeader>,
     _unknown_offset: FilePtr64<()>,
-    pub layers_offset: FilePtr64<LayerHeader>,
+    pub layers_offset: FilePtr64<ArrayOf<Layer>>,
     _unknown_2: [u8; 0x1A8],
 }
 
@@ -23,5 +23,6 @@ pub struct Thumbnail {
     _zeros_2: [u32; 3],
 
     #[br(count = dimension_x * dimension_y)]
-    pub pixels: Vec<Rgba>,
+    // pub pixels: Vec<Rgba>, // Takes ~1s longer
+    pub pixels: Vec<u32>,
 }

+ 22 - 15
src/ezcad/layer.rs

@@ -2,20 +2,20 @@ use binrw::{BinRead, BinWrite};
 
 use crate::{
     object::Object,
-    types::{Field, WString, F64, U16, U32},
+    types::{Field, WString, F64, U16, U32}, array_of::ArrayOf,
 };
 
-#[derive(BinRead, BinWrite, Debug)]
-pub struct LayerHeader {
-    pub layer_count: u32,
-    #[br(count = layer_count)]
-    pub layers: Vec<Layer>,
-}
+// #[derive(BinRead, BinWrite, Debug)]
+// pub struct LayerHeader {
+//     // pub layer_count: u32,
+//     // #[br(count = layer_count)]
+//     // pub layers: Vec<Layer>,
+//     pub layers: ArrayOf<Layer>,
+// }
 
 #[derive(BinRead, BinWrite, Debug)]
-pub struct Layer {
-    #[br(assert(field_count_1 == 17))]
-    field_count_1: u32, // Number of fields until objects
+#[brw(magic(17u32))] // Number of fields within this struct
+pub struct LayerPre {
     _unknown_1: [Field; 3],
     pub name: WString,
     pub count: U32,
@@ -23,11 +23,11 @@ pub struct Layer {
     pub input_signal_wait_enable_mask: U16,
     pub input_signal_wait_disable_mask: U16,
     _unknown_3: [Field; 9],
-    pub object_count: u32,
-    #[br(count = object_count)]
-    pub objects: Vec<Object>,
-    #[br(assert(field_count_2 == 151))]
-    field_count_2: u32, // Number of remaining fields
+}
+
+#[derive(BinRead, BinWrite, Debug)]
+#[brw(magic(151u32))] // Number of fields within this struct
+pub struct LayerPost {
     _unknown_4: [Field; 54],
     pub output_signal_start_enable_mask: U16,
     pub output_signal_start_disable_mask: U16,
@@ -45,3 +45,10 @@ pub struct Layer {
     _unknown_8: [Field; 12],
     footer: u32,
 }
+
+#[derive(BinRead, BinWrite, Debug)]
+pub struct Layer {
+    pub pre: LayerPre,
+    pub objects: ArrayOf<Object>,
+    pub post: LayerPost,
+}

+ 1 - 2
src/ezcad/pen.rs

@@ -24,9 +24,8 @@ pub struct Pens {
 }
 
 #[derive(BinRead, BinWrite, Debug)]
+#[brw(magic(236u32))] // Number of fields within this struct
 pub struct Pen {
-    #[br(assert(field_count == 236))]
-    field_count: u32,
     pub color: FieldOf<Rgba>,
     pub name: WString,
     pub disabled: U32,

+ 1 - 1
src/main.rs

@@ -45,7 +45,7 @@ fn main() {
     // for i in 0..50 {
     //     dbg!(&file.pens_offset.start_offset.pens[i].disabled);
     // }
-    // dbg!(String::from(&file.pens_offset.start_offset.pens[0].name));
+    dbg!(String::from(&file.pens_offset.start_offset.pens[0].name));
     // dbg!(&file.pens_offset.start_offset.pens[255].wobble_type);
 
 }