chiark / gitweb /
shapelib: Support occultation by back
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 22 Mar 2021 02:16:33 +0000 (02:16 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 22 Mar 2021 02:20:18 +0000 (02:20 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib-toml.rs
src/shapelib.rs

index dde24de8a8543110abbab8e717b2f86a27c24416..d36e2b0514b6a7ac7c680bfd176cb382c9835dcd 100644 (file)
@@ -174,6 +174,9 @@ pub enum OccultationMethod {
   ByColour {
     colour: String,
   },
+  ByBack {
+    ilk: OccultIlkName,
+  },
 }
 
 /// An entry in the `colours` table, specifying one recolouring.
index 747a372d2099cc372fb77cbc83717848360c6073..d3e0222c333d9530908147da6fd7ab622eb472c8 100644 (file)
@@ -54,6 +54,7 @@ struct ItemData {
 enum OccData {
   None,
   Internal(Arc<OccData_Internal>),
+  Back(OccultIlkName),
 }
 
 #[allow(non_camel_case_types)]
@@ -85,6 +86,8 @@ pub enum LibraryLoadError {
   #[error("{:?}",&self)]
   OccultationColourMissing(String),
   #[error("{:?}",&self)]
+  BackMissingForOccultation,
+  #[error("{:?}",&self)]
   ExpectedTable(String),
   #[error("{:?}",&self)]
   ExpectedString(String),
@@ -381,7 +384,7 @@ impl Contents {
       .map_err(|e| SpE::InternalError(format!("reckoning transform: {}",&e)))?;
     let mut face = ItemFace { svg, desc, xform };
     let mut faces = index_vec![ face ];
-    let mut back = None;
+    let mut back = None::<Arc<dyn OccultedPieceTrait>>;
     if idata.group.d.flip {
       face.xform.scale[0] *= -1.;
       faces.push(face);
@@ -394,6 +397,12 @@ impl Contents {
 
     let occultable = match &idata.occ {
       OccData::None => None,
+      OccData::Back(ilk) => {
+        let back = if let Some(back) = &back { back }
+        else { throw!(internal_error_bydebug(&self)) };
+        let back = back.clone();
+        Some((ilk.clone(), back))
+      },
       OccData::Internal(occ) => {
         let name = occ.item_name.clone();
         let svgd = {
@@ -589,6 +598,12 @@ fn load_catalogue(libname: &str, dirname: &str, toml_path: &str) -> Contents {
             svgd: default(),
           }))
         },
+        Some(OccultationMethod::ByBack { ilk }) => {
+          if group.d.back.is_none() {
+            throw!(LLE::BackMissingForOccultation)
+          }
+          OccData::Back(ilk.clone())
+        },
       };
 
       let mut add1 = |item_name: &str, desc: Html| {