From c23257e11e29845598281ec0e6acabdc8b281b7e Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 20 Aug 2007 01:19:15 -0300 Subject: [PATCH] Calculate vertical extent of arpeggio via positions property. This eliminates duplicate code, and allows manual override of arpeggio(bracket) extents. --- lily/arpeggio.cc | 58 ++++++++++++++++++---------------- lily/include/arpeggio.hh | 2 ++ scm/define-grob-properties.scm | 9 +++--- scm/define-grobs.scm | 1 + 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/lily/arpeggio.cc b/lily/arpeggio.cc index b501117624..6773b846e9 100644 --- a/lily/arpeggio.cc +++ b/lily/arpeggio.cc @@ -18,12 +18,9 @@ #include "lookup.hh" #include "pointer-group-interface.hh" -MAKE_SCHEME_CALLBACK (Arpeggio, print, 1); -SCM -Arpeggio::print (SCM smob) +Grob * +Arpeggio::get_common_y (Grob *me) { - Grob *me = unsmob_grob (smob); - Grob *common = me; extract_grob_set (me, "stems", stems); @@ -34,17 +31,27 @@ Arpeggio::print (SCM smob) Y_AXIS); } + return common; +} + +MAKE_SCHEME_CALLBACK(Arpeggio, calc_positions, 1); +SCM +Arpeggio::calc_positions (SCM grob) +{ + Grob *me = unsmob_grob (grob); + Grob *common = get_common_y (me); + /* TODO: Using stems here is not very convenient; should store noteheads instead, and also put them into the support. Now we will mess up in vicinity of a collision. - */ Interval heads; Real my_y = me->relative_coordinate (common, Y_AXIS); + extract_grob_set (me, "stems", stems); for (vsize i = 0; i < stems.size (); i++) { Grob *stem = stems[i]; @@ -56,6 +63,20 @@ Arpeggio::print (SCM smob) - my_y); } + heads *= 1/Staff_symbol_referencer::staff_space(me); + + return ly_interval2scm (heads); +} + +MAKE_SCHEME_CALLBACK (Arpeggio, print, 1); +SCM +Arpeggio::print (SCM smob) +{ + Grob *me = unsmob_grob (smob); + Interval heads = robust_scm2interval (me->get_property ("positions"), + Interval()) + * Staff_symbol_referencer::staff_space (me); + if (heads.is_empty () || heads.length () < 0.5) { if (!to_boolean (me->get_property ("transparent"))) @@ -101,27 +122,9 @@ SCM Arpeggio::brew_chord_bracket (SCM smob) { Grob *me = unsmob_grob (smob); - Grob *common = me; - - extract_grob_set (me, "stems", stems); - for (vsize i = 0; i < stems.size (); i++) - { - Grob *stem = stems[i]; - common = common->common_refpoint (Staff_symbol_referencer::get_staff_symbol (stem), - Y_AXIS); - } - - Interval heads; - Real my_y = me->relative_coordinate (common, Y_AXIS); - - for (vsize i = 0; i < stems.size (); i++) - { - Grob *stem = stems[i]; - Grob *ss = Staff_symbol_referencer::get_staff_symbol (stem); - Interval iv = Stem::head_positions (stem); - iv *= Staff_symbol::staff_space (ss) / 2.0; - heads.unite (iv + ss->relative_coordinate (common, Y_AXIS) - my_y); - } + Interval heads = robust_scm2interval (me->get_property ("positions"), + Interval()) + * Staff_symbol_referencer::staff_space (me); Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); Real sp = 1.5 * Staff_symbol_referencer::staff_space (me); @@ -170,6 +173,7 @@ ADD_INTERFACE (Arpeggio, /* properties */ "arpeggio-direction " + "positions " "stems " "script-priority " // TODO: make around-note-interface ); diff --git a/lily/include/arpeggio.hh b/lily/include/arpeggio.hh index c18eb10c3e..7db201bb00 100644 --- a/lily/include/arpeggio.hh +++ b/lily/include/arpeggio.hh @@ -16,7 +16,9 @@ class Arpeggio { public: + static Grob *get_common_y (Grob *); DECLARE_SCHEME_CALLBACK (print, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_positions, (SCM)); DECLARE_SCHEME_CALLBACK (brew_chord_bracket, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 1319cf645d..754ebcb00e 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -406,11 +406,12 @@ at a column with a negative penalty.") whether to put a page turn at this column. Can be @code{force} or @code{allow}.") (parenthesized ,boolean? "Parenthesize this grob.") - (positions ,pair? "Pair of staff coordinates @code{(@var{left} + (positions ,number-pair? "Pair of staff coordinates @code{(@var{left} . @var{right})}, where both @var{left} and @var{right} are in -@code{staff-space} units of the current staff. LilyPond uses these -values to select which slur candidate positions to use; if extreme -positions are requested, LilyPond selects the closest positions.") +@code{staff-space} units of the current staff. + +For slurs, this value selects which slur candidate +to use; if extreme positions are requested, the closest one is taken.") (ratio ,number? "Parameter for slur shape. The higher this number, the quicker the slur attains its @code{height-limit}.") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index ce76c346f8..caf1947323 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -150,6 +150,7 @@ (Y-offset . ,ly:staff-symbol-referencer::callback) (X-offset . ,ly:side-position-interface::x-aligned-side) (direction . ,LEFT) + (positions . ,ly:arpeggio::calc-positions) (padding . 0.5) (script-priority . 0) (side-axis . ,X) -- 2.39.2