chiark / gitweb /
mformat 2: Actually implement the outline resizing
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 12 May 2022 00:42:37 +0000 (01:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 12 May 2022 00:55:36 +0000 (01:55 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib.rs

index 65e0242f5f083f531284ec14f860e99a45b088f5..ed46e30f19b4132b8f84e26ba3ddb182820c1d6f 100644 (file)
@@ -114,6 +114,10 @@ pub enum LibraryLoadError {
                                         FilesListFieldsMustBeAtStart(usize),
   #[error("piece defines multiple faces in multiple ways")]
                                         MultipleMultipleFaceDefinitions,
+  #[error("outline specified both size and numeric scale")]
+                                        OutlineContradictoryScale,
+  #[error("{0}")] CoordinateOverflow(#[from] CoordinateOverflow),
+
   #[error("{0}")]
   MaterialsFormatIncompat(#[from] materials_format::Incompat<
     LibraryLoadMFIncompat
@@ -692,7 +696,19 @@ impl GroupData {
         (None, SD::Stretch(s)) => of_stretch(s),
       };
 
-      let outline = self.d.outline.shape().load(size);
+      let osize = {
+        let (osize, oscale) = self.d.outline.size_scale();
+        let osize = resolve_square_size(&osize)?;
+        match (osize, oscale) {
+          (Some(osize), None         ) => osize,
+          (None,        Some(&oscale)) => (size * oscale)?,
+          (None,        None         ) => size,
+          (Some(_),     Some(_)      ) =>
+            throw!(LLE::OutlineContradictoryScale)
+        }
+      };
+
+      let outline = self.d.outline.shape().load(osize);
       (FaceTransform { scale: scale.coords, centre: centre.coords }, outline)
 
     } else {