diff --git a/crates/idml/src/import.rs b/crates/idml/src/import.rs
index 9fd519efb..108df9430 100644
--- a/crates/idml/src/import.rs
+++ b/crates/idml/src/import.rs
@@ -499,10 +499,12 @@ impl<'r> Importer<'r> {
characters: c.get("CustomCharacters").unwrap_or("").into(),
family: c.prop("AppliedFont").unwrap_or_default(),
style: c.get("FontStyle").unwrap_or("Regular").trim_start_matches("$ID/").into(),
- relative_size: c.num("RelativeSize").unwrap_or(100.0) / 100.0,
- horizontal_scale: c.num("HorizontalScale").unwrap_or(100.0) / 100.0,
- vertical_scale: c.num("VerticalScale").unwrap_or(100.0) / 100.0,
- baseline_shift: c.num("BaselineShift").unwrap_or(0.0) / 100.0,
+ // A metric `Document::check` refuses would make the whole file fail to
+ // open, so one that is unusable here falls back to full size / no shift.
+ relative_size: c.num("RelativeSize").filter(|v| v.is_finite() && *v > 0.0).unwrap_or(100.0) / 100.0,
+ horizontal_scale: c.num("HorizontalScale").filter(|v| v.is_finite() && *v > 0.0).unwrap_or(100.0) / 100.0,
+ vertical_scale: c.num("VerticalScale").filter(|v| v.is_finite() && *v > 0.0).unwrap_or(100.0) / 100.0,
+ baseline_shift: c.num("BaselineShift").filter(|v| v.is_finite()).unwrap_or(0.0) / 100.0,
scale_option: c.boolean("ScaleOption").unwrap_or(true),
})
.collect();
@@ -531,9 +533,9 @@ impl<'r> Importer<'r> {
target_class: r.num("TargetMojikumiClass").unwrap_or(0.0) as i16,
side_class: r.num("SideMojikumiClass").unwrap_or(0.0) as i16,
after: r.boolean("SideIsAfterTarget").unwrap_or(false),
- minimum: r.num("Minimum").unwrap_or(0.0),
- desired: r.num("Desired").unwrap_or(0.0),
- maximum: r.num("Maximum").unwrap_or(0.0),
+ minimum: r.num("Minimum").filter(|v| v.is_finite()).unwrap_or(0.0),
+ desired: r.num("Desired").filter(|v| v.is_finite()).unwrap_or(0.0),
+ maximum: r.num("Maximum").filter(|v| v.is_finite()).unwrap_or(0.0),
priority: r.num("CompressionPriority").unwrap_or(0.0) as i16,
does_not_float: r.boolean("AkiDoesNotFloat").unwrap_or(false),
})
diff --git a/crates/idml/src/tests.rs b/crates/idml/src/tests.rs
index 042a0c8d9..cc5067313 100644
--- a/crates/idml/src/tests.rs
+++ b/crates/idml/src/tests.rs
@@ -2443,6 +2443,32 @@ fn the_default_cjk_leading_model_applies_only_with_a_japanese_composer() {
assert_eq!(model("$ID/HL Single J"), Some(designcraft_doc::cjk::LeadingModel::AkiBelow));
}
+/// A composite-font or mojikumi metric `Document::check` refuses (zero, NaN, infinity) must
+/// not make the whole package fail to open: the entry falls back to a usable value instead.
+#[test]
+fn unusable_cjk_metrics_do_not_refuse_the_whole_file() {
+ let designmap = r#"
+
+
+
+
+
+
+
+
+
+
+ "#;
+ let spread = r#"
+
+ "#;
+ let d = import_idml(&zip_files(&[("designmap.xml", &designmap), ("Spreads/Spread_s.xml", &spread)])).unwrap();
+ let entries = &d.styles.composite_fonts[0].entries;
+ assert_eq!(entries[0].relative_size, 1.0, "an unusable relative size falls back to full size");
+ assert_eq!(entries[1].baseline_shift, 0.0, "an unusable shift falls back to none");
+ assert_eq!(d.styles.mojikumi_tables[0].overrides[0].minimum, 0.0);
+}
+
mod liquid_page_rules {
use super::*;
use designcraft_doc::LiquidRule as R;