diff --git a/crates/idml/src/export.rs b/crates/idml/src/export.rs index b07c0e44c..4366833de 100644 --- a/crates/idml/src/export.rs +++ b/crates/idml/src/export.rs @@ -1819,15 +1819,23 @@ impl<'a> Ex<'a> { .attr("ItemTransform", format!("1 0 0 1 {} {}", num(pg.x - ox), num(-oy))) .child(margin_el(pg)); let mut pe = pe; - // Ruler guides, measured from the spread's top left (RulerOrigin is SpreadOrigin). + // Ruler guides, measured from the ruler origin written in the preferences: the + // spread's top left, the page's, or the spine (the import reads them the same way). let left = sp.pages.iter().map(|p| p.x).fold(f64::INFINITY, f64::min); let left = if left.is_finite() { left } else { 0.0 }; + let spine = sp.pages.iter().map(|p| p.x - left).filter(|x| *x > 1e-6).fold(f64::INFINITY, f64::min); + let spine = if spine.is_finite() && facing { spine } else { 0.0 }; + let origin_x = match d.settings.ruler_origin { + designcraft_doc::RulerOrigin::Spread => left, + designcraft_doc::RulerOrigin::Page => pg.x, + designcraft_doc::RulerOrigin::Spine => left + spine, + }; for g in &pg.guides { let vertical = g.orientation == designcraft_doc::Orientation::Vertical; let mut ge = El::new("Guide") .attr("Self", format!("{}g{}", uid(pg.id.0), pe.elements().count())) .attr("Orientation", if vertical { "Vertical" } else { "Horizontal" }) - .attr("Location", num(if vertical { g.position - left } else { g.position })) + .attr("Location", num(if vertical { g.position - origin_x } else { g.position })) .attr("FitToPage", bool_s(!g.spread)) .attr("ViewThreshold", "5") .attr("Locked", bool_s(g.locked)) diff --git a/crates/idml/src/tests.rs b/crates/idml/src/tests.rs index 8bc4a7cf9..866660820 100644 --- a/crates/idml/src/tests.rs +++ b/crates/idml/src/tests.rs @@ -3838,11 +3838,15 @@ fn ruler_guides_import_and_round_trip() { assert_eq!(guides(&d)[0].1, 40.0); assert_eq!(d.parents[0].pages[0].guides.len(), 1, "a parent page's guide"); assert_eq!(d.parents[0].pages[0].guides[0].position, 84.0); - // Round trip: written under each page, read back where they were. - let d = import_idml(&guides_package("PageOrigin")).unwrap(); - let back = import_idml(&export_idml(&d)).unwrap(); - assert_eq!(guides(&back), guides(&d)); - assert_eq!(back.parents[0].pages[0].guides.len(), 1); + // Round trip: written under each page from the document's ruler origin, read back where + // they were. + for origin in ["PageOrigin", "SpineOrigin", "SpreadOrigin"] { + let d = import_idml(&guides_package(origin)).unwrap(); + let back = import_idml(&export_idml(&d)).unwrap(); + assert_eq!(guides(&back), guides(&d), "{origin}"); + assert_eq!(back.parents[0].pages[0].guides.len(), 1); + assert_eq!(back.parents[0].pages[0].guides[0].position, d.parents[0].pages[0].guides[0].position, "{origin}"); + } } /// A package entry nothing in `designmap.xml` refers to is never decompressed: a damaged one