From 74b008a3d5f390a0429dd8fab7dd20f2704e826b Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Wed, 25 Apr 2007 16:35:30 +1000 Subject: [PATCH] Add regression tests for break-alignment anchor stuff. Add anchors to some other break-aligned grobs by default. --- .../break-alignment-anchor-alignment.ly | 20 ++++++++++++++++++ input/regression/break-alignment-anchors.ly | 19 +++++++++++++++++ input/regression/rehearsal-mark-align.ly | 1 + lily/break-alignment-interface.cc | 21 ++++++++++++------- lily/include/break-align-interface.hh | 3 ++- scm/define-grob-properties.scm | 3 +++ scm/define-grobs.scm | 6 +++++- 7 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 input/regression/break-alignment-anchor-alignment.ly create mode 100644 input/regression/break-alignment-anchors.ly diff --git a/input/regression/break-alignment-anchor-alignment.ly b/input/regression/break-alignment-anchor-alignment.ly new file mode 100644 index 0000000000..b0925541c7 --- /dev/null +++ b/input/regression/break-alignment-anchor-alignment.ly @@ -0,0 +1,20 @@ +\version "2.11.22" + +\header { + texidoc = "The default callback for break-align-anchor in clefs and time/key +signatures reads the break-align-anchor-aligment property to align +the anchor to the extent of the break-aligned grob." +} + +{ + \override Score.RehearsalMark #'break-align-symbol = #'key-signature + c1 + \key cis \major + \once \override Staff.KeySignature #'break-align-anchor-alignment = #LEFT + \mark \default + cis1 + \key ces \major + \once \override Staff.KeySignature #'break-align-anchor-alignment = #RIGHT + \mark \default + ces1 +} \ No newline at end of file diff --git a/input/regression/break-alignment-anchors.ly b/input/regression/break-alignment-anchors.ly new file mode 100644 index 0000000000..ced785dc15 --- /dev/null +++ b/input/regression/break-alignment-anchors.ly @@ -0,0 +1,19 @@ +\version "2.11.22" + +\header { + texidoc = "The break-align-anchor property of a break-aligned grob gives +the horizontal offset at which other grobs should attach." +} + +{ + \override Score.RehearsalMark #'break-align-symbol = #'staff-bar + c'1 + \once \override Staff.BarLine #'break-align-anchor = #-5 + \mark \default + \noBreak + c'1 + \once \override Staff.BarLine #'break-align-anchor = #5 + \mark \default + \noBreak + c'1 +} \ No newline at end of file diff --git a/input/regression/rehearsal-mark-align.ly b/input/regression/rehearsal-mark-align.ly index 7b82049008..5238a3889e 100644 --- a/input/regression/rehearsal-mark-align.ly +++ b/input/regression/rehearsal-mark-align.ly @@ -11,6 +11,7 @@ \relative { c1 \mark "foo" + c1 \key cis \major \clef alto \override Score.RehearsalMark #'break-align-symbol = #'key-signature diff --git a/lily/break-alignment-interface.cc b/lily/break-alignment-interface.cc index 7e866a551f..1487252716 100644 --- a/lily/break-alignment-interface.cc +++ b/lily/break-alignment-interface.cc @@ -290,12 +290,6 @@ Break_alignable_interface::self_align_callback (SCM grob) break ; } - Direction which_edge = LEFT; - if (vsize (last_idx_found + 1) < elements.size ()) - last_idx_found ++; - else - which_edge = RIGHT; - Grob *alignment_parent = elements[last_idx_found]; Grob *common = me->common_refpoint (alignment_parent, X_AXIS); Real anchor = robust_scm2double (alignment_parent->get_property ("break-align-anchor"), 0); @@ -305,9 +299,9 @@ Break_alignable_interface::self_align_callback (SCM grob) + anchor); } -MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_anchor, 1) +MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_average_anchor, 1) SCM -Break_aligned_interface::calc_anchor (SCM grob) +Break_aligned_interface::calc_average_anchor (SCM grob) { Grob *me = unsmob_grob (grob); Real avg = 0.0; @@ -328,6 +322,16 @@ Break_aligned_interface::calc_anchor (SCM grob) return scm_from_double (count > 0 ? avg / count : 0); } +MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_extent_aligned_anchor, 1) +SCM +Break_aligned_interface::calc_extent_aligned_anchor (SCM smob) +{ + Grob *me = unsmob_grob (smob); + Real alignment = robust_scm2double (me->get_property ("break-align-anchor-alignment"), 0.0); + + return scm_from_double (me->extent (me, X_AXIS).linear_combination (alignment)); +} + ADD_INTERFACE (Break_alignable_interface, "Object that is aligned on a break aligment. ", @@ -363,6 +367,7 @@ ADD_INTERFACE (Break_aligned_interface, /* properties */ "break-align-anchor " + "break-align-anchor-alignment " "break-align-symbol " "space-alist " ); diff --git a/lily/include/break-align-interface.hh b/lily/include/break-align-interface.hh index 211ad0da8b..f3633c2bad 100644 --- a/lily/include/break-align-interface.hh +++ b/lily/include/break-align-interface.hh @@ -25,7 +25,8 @@ public: struct Break_aligned_interface { - DECLARE_SCHEME_CALLBACK (calc_anchor, (SCM element)); + DECLARE_SCHEME_CALLBACK (calc_average_anchor, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_extent_aligned_anchor, (SCM)); DECLARE_GROB_INTERFACE(); }; diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 992b7f098d..3bf185ac42 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -97,6 +97,9 @@ bracket.") grob will have their X-offsets shifted by this number. In barlines, for example, this is used to position grobs relative to the (visual) center of the barline.") + (break-align-anchor-alignment ,number? "Read by +ly:break-aligned-interface::calc-extent-aligned-anchor for aligning +an anchor to a grobs extent") (break-align-symbol ,symbol? "This key is used for aligning and spacing breakable items.") (break-align-orders ,vector? "Defines the order in which diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 8b32b4c6b9..3ab5b2c677 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -411,7 +411,7 @@ . ( (axes . (0)) (X-extent . ,ly:axis-group-interface::width) - (break-align-anchor . ,ly:break-aligned-interface::calc-anchor) + (break-align-anchor . ,ly:break-aligned-interface::calc-average-anchor) (meta . ((class . Item) (interfaces . (break-aligned-interface axis-group-interface)))))) @@ -447,6 +447,7 @@ (avoid-slur . inside) (font-family . music) (break-align-symbol . clef) + (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (break-visibility . ,begin-of-line-visible) (space-alist . ((ambitus . (extra-space . 2.0)) (staff-bar . (extra-space . 0.7)) @@ -857,6 +858,7 @@ (first-note . (fixed-space . 2.5)))) (Y-offset . ,ly:staff-symbol-referencer::callback) (break-align-symbol . key-signature) + (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (break-visibility . ,begin-of-line-visible) (non-musical . #t) (meta . ((class . Item) @@ -905,6 +907,7 @@ (LeftEdge . ( (break-align-symbol . left-edge) + (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (X-extent . (0 . 0)) (non-musical . #t) (break-visibility . ,center-invisible) @@ -1897,6 +1900,7 @@ . ( (stencil . ,ly:time-signature::print) (break-align-symbol . time-signature) + (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (break-visibility . ,all-visible) (avoid-slur . inside) (space-alist . ( -- 2.39.2