chiark / gitweb /
shapelib: Provide sensible default for centre
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Mar 2021 23:36:39 +0000 (23:36 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Mar 2021 23:39:35 +0000 (23:39 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib-toml.rs
src/shapelib.rs

index 8ae0f8d3f8b95b81a989da53d3f1d6625d64cb00..796b91c754a7ac474fccd0d433cbac52b140a03f 100644 (file)
@@ -110,7 +110,9 @@ pub struct GroupDetails {
   /// scale by different amounts in x and y.
   pub orig_size: Vec<f64>,
 
-  pub centre: [f64; 2],
+  #[serde(default)]
+  /// Default if not supplied is the centre according to the size.
+  pub centre: Option<[f64; 2]>,
 
   #[serde(default)]
   /// Default is `false`
index 02a5564509e402d92b0b5c47bd8a9130e94b558d..13090a463e6a0e0f086a1d18ebaa5ce235230d01 100644 (file)
@@ -196,9 +196,23 @@ impl OutlineTrait for Item { delegate! { to self.outline {
 impl FaceTransform {
   #[throws(LLE)]
   fn from_group(d: &GroupDetails) -> Self {
-    let centre = d.centre;
+    // by this point d.size has already been scaled by scale
+    let centre = d.centre.map(Ok).unwrap_or_else(|| Ok::<_,LLE>({
+      match d.size.as_slice() {
+        [a] => [a,a],
+        [a,b] => [a,b],
+        x => throw!(LLE::WrongNumberOfSizeDimensions {
+          got: x.len(),
+          expected: [1,2],
+        }),
+      }.iter().cloned().map(|size| {
+        size * 0.5 / d.scale
+      })
+        .collect::<ArrayVec<[_;2]>>()
+        .into_inner()
+        .unwrap()
+    }))?;
     let scale = if ! d.orig_size.is_empty() && ! d.size.is_empty() {
-      // by this point d.size has already been scaled by scale
       izip!(&d.orig_size, &d.size)
         .map(|(&orig_size, &target_size)| {
           target_size / orig_size