chiark / gitweb /
shapelib: Provide orig_size option
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Mar 2021 22:56:25 +0000 (22:56 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Mar 2021 22:57:27 +0000 (22:57 +0000)
This is often more convenient than `scale` plus `size`

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib-toml.rs
src/shapelib.rs

index ff86c643dc8ec61da875a5a4da801087405069ec..3a2297e255747a8f6d41137fa6dbc43bffe6ba57 100644 (file)
@@ -104,6 +104,12 @@ pub struct GroupDetails {
   // scaled when put into GroupData
   pub size: Vec<f64>,
   
+  #[serde(default)]
+  /// If specified, the input is first scaled from `orig_size` to
+  /// `size`.  If both `size` and `orig_size` are 2 elements, may
+  /// scale by different amounts in x and y.
+  pub orig_size: Vec<f64>,
+
   #[serde(default)]
   /// Default if not supplied is `[0,0]`.
   pub centre: [f64; 2],
index dee0c05761fe905d41c476c6af6e3815b612fd6e..02a5564509e402d92b0b5c47bd8a9130e94b558d 100644 (file)
@@ -197,8 +197,22 @@ impl FaceTransform {
   #[throws(LLE)]
   fn from_group(d: &GroupDetails) -> Self {
     let centre = d.centre;
-    let scale = d.scale;
-    FaceTransform { centre, scale: [scale,scale] }
+    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
+        })
+        .cycle()
+        .take(2)
+        .collect::<ArrayVec<[_;2]>>()
+        .into_inner()
+        .unwrap()
+    } else {
+      let s = d.scale;
+      [s,s]
+    };
+    FaceTransform { centre, scale }
   }
 
   #[throws(IE)]