From 0da65512d3ef498ace08623f449b4af08411a89c Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 16 Oct 2006 22:23:38 +0000 Subject: [PATCH] * lily/script-column.cc (row_before_line_breaking): also handle accidentals and arpeggios in horizontal script stacking. * lily/script-row-engraver.cc (acknowledge_accidental_placement): new function. * input/regression/script-stack-horizontal.ly: trim. --- ChangeLog | 10 ++++++++++ input/regression/script-stack-horizontal.ly | 12 ++++------- lily/script-column.cc | 22 +++++++++++++++------ lily/script-row-engraver.cc | 16 +++++++++++++-- ly/engraver-init.ly | 2 +- scm/define-grobs.scm | 9 ++++++++- 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index e8d001f3d9..b8cb6fd6bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-10-17 Han-Wen Nienhuys + + * lily/script-column.cc (row_before_line_breaking): also handle + accidentals and arpeggios in horizontal script stacking. + + * lily/script-row-engraver.cc (acknowledge_accidental_placement): + new function. + + * input/regression/script-stack-horizontal.ly: trim. + 2006-10-16 Han-Wen Nienhuys * scm/output-lib.scm (stroke-finger::calc-text): allow reading of diff --git a/input/regression/script-stack-horizontal.ly b/input/regression/script-stack-horizontal.ly index e9cba0687a..7e69ea60da 100644 --- a/input/regression/script-stack-horizontal.ly +++ b/input/regression/script-stack-horizontal.ly @@ -1,3 +1,4 @@ + \header { texidoc = "horizontal scripts are ordered, so they do not overlap. @@ -12,14 +13,9 @@ The order may be set with script-priority." \relative { - \set stringFingerOrientations = #'(left) + \set stringNumberOrientations = #'(left) \set fingeringOrientations = #'(left) - \set strokeNumberOrientations = #'(left) + \set strokeFingerOrientations = #'(left) \arpeggio + -\rightHandFinger #1 f>\arpeggio } diff --git a/lily/script-column.cc b/lily/script-column.cc index 0710cd483a..a50f794961 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -8,6 +8,8 @@ #include "script-column.hh" +#include "accidental-placement.hh" +#include "arpeggio.hh" #include "directional-element-interface.hh" #include "side-position-interface.hh" #include "warn.hh" @@ -49,6 +51,7 @@ Script_column::row_before_line_breaking (SCM smob) extract_grob_set (me, "scripts", scripts); Grob_scripts_map head_scripts_map; + vector affect_all_grobs; for (vsize i = 0; i < scripts.size (); i++) { Grob *sc = scripts[i]; @@ -56,8 +59,13 @@ Script_column::row_before_line_breaking (SCM smob) /* Don't want to consider scripts horizontally next to notes. */ - if (sc->get_property_data (ly_symbol2scm ("Y-offset")) != - Side_position_interface::x_aligned_side_proc) + if (Accidental_placement::has_interface (sc) + || Arpeggio::has_interface (sc)) + { + affect_all_grobs.push_back (sc); + } + else if (sc->get_property_data (ly_symbol2scm ("Y-offset")) != + Side_position_interface::x_aligned_side_proc) { head_scripts_map[sc->get_parent (Y_AXIS)].push_back (sc); } @@ -67,7 +75,11 @@ Script_column::row_before_line_breaking (SCM smob) i != head_scripts_map.end (); i++) { - order_grobs ((*i).second); + vector grobs = (*i).second; + + // this isn't right in all cases, but in general a safe assumption. + concat (grobs, affect_all_grobs); + order_grobs (grobs); } return SCM_UNSPECIFIED; @@ -85,7 +97,6 @@ Script_column::before_line_breaking (SCM smob) for (vsize i = 0; i < scripts.size (); i++) { Grob *sc = scripts[i]; - /* Don't want to consider scripts horizontally next to notes. */ @@ -93,10 +104,9 @@ Script_column::before_line_breaking (SCM smob) Side_position_interface::x_aligned_side_proc) staff_sided.push_back (sc); } - + order_grobs (staff_sided); return SCM_UNSPECIFIED; - } void diff --git a/lily/script-row-engraver.cc b/lily/script-row-engraver.cc index 3f81f54380..da06274270 100644 --- a/lily/script-row-engraver.cc +++ b/lily/script-row-engraver.cc @@ -7,8 +7,9 @@ */ - #include "engraver.hh" + +#include "accidental-placement.hh" #include "script-column.hh" #include "side-position-interface.hh" @@ -27,6 +28,7 @@ class Script_row_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Script_row_engraver); protected: + DECLARE_ACKNOWLEDGER (accidental_placement); DECLARE_ACKNOWLEDGER (side_position); void process_acknowledged (); void stop_translation_timestep (); @@ -43,7 +45,8 @@ Script_row_engraver::stop_translation_timestep () if (script_row_) { for (vsize i = 0; i < scripts_.size (); i++) - if (Side_position_interface::get_axis (scripts_[i]) == X_AXIS) + if (Accidental_placement::has_interface (scripts_[i]) + || Side_position_interface::get_axis (scripts_[i]) == X_AXIS) Script_column::add_side_positioned (script_row_, scripts_[i]); } @@ -62,6 +65,14 @@ Script_row_engraver::acknowledge_side_position (Grob_info inf) } } + +void +Script_row_engraver::acknowledge_accidental_placement (Grob_info inf) +{ + scripts_.push_back (inf.grob ()); +} + + void Script_row_engraver::process_acknowledged () { @@ -70,6 +81,7 @@ Script_row_engraver::process_acknowledged () } +ADD_ACKNOWLEDGER (Script_row_engraver, accidental_placement); ADD_ACKNOWLEDGER (Script_row_engraver, side_position); ADD_TRANSLATOR (Script_row_engraver, /* doc */ "Determine order in horizontal side position elements. ", diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index e46bf7f89c..c2a5b11221 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -40,6 +40,7 @@ \consists "Axis_group_engraver" \consists "Figured_bass_engraver" \consists "Figured_bass_position_engraver" + \consists "Script_row_engraver" \override VerticalAxisGroup #'minimum-Y-extent = #'(-4 . 4) extraVerticalExtent = ##f @@ -219,7 +220,6 @@ contained staves are not connected vertically." \consists "Script_engraver" \consists "Script_column_engraver" - \consists "Script_row_engraver" \consists "Rhythmic_column_engraver" \consists "Phrasing_slur_engraver" \consists "Cluster_spanner_engraver" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 69b68fec68..14eb7e1796 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -55,6 +55,10 @@ . ( (left-padding . 0.2) + ;; for horizontally stacked scripts. + (script-priority . -100) + (direction . ,LEFT) + (positioning-done . ,ly:accidental-placement::calc-positioning-done) (X-extent . ,ly:axis-group-interface::width) @@ -63,6 +67,7 @@ (right-padding . 0.15) (meta . ((class . Item) (interfaces . (accidental-placement-interface)))))) + (Ambitus . ( (axes . (0 1)) @@ -130,6 +135,7 @@ (X-offset . ,ly:side-position-interface::x-aligned-side) (direction . ,LEFT) (padding . 0.5) + (script-priority . 0) (side-axis . ,X) (staff-position . 0.0) (meta . ((class . Item) @@ -1471,6 +1477,7 @@ (duration-log . ,note-head::calc-duration-log) (default-direction . ,ly:stem::calc-default-direction) (stem-end-position . ,ly:stem::calc-stem-end-position) + (neutral-direction . ,DOWN) (stem-info . ,ly:stem::calc-stem-info) (positioning-done . ,ly:stem::calc-positioning-done) @@ -1552,7 +1559,7 @@ . ( (stencil . ,ly:text-interface::print) (text . ,stroke-finger::calc-text) - (digit-names . #("P" "I" "m" "a" "x")) + (digit-names . #("p" "i" "m" "a" "x")) (padding . 0.5) (staff-padding . 0.5) (self-alignment-X . 0) -- 2.39.2