From 26d40794616f7dc6d47af25bb373a5d2353633cf Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Wed, 28 Dec 2011 09:50:18 +0100 Subject: [PATCH] TupletBracket and TupletNumber avoid Script by default. This can be turned off by setting avoid-scripts to ##f. Scripts are placed in a "scripts" grob array in the tuplet-engraver and are then accessed in tuplet-bracket.cc and treated as items to encompass when calculating a bracket's vertical position. --- .../tuplet-bracket-avoid-scripts.ly | 10 ++++++++ .../tuplet-bracket-outside-staff-priority.ly | 3 ++- .../tuplet-number-outside-staff-priority.ly | 3 ++- lily/include/tuplet-bracket.hh | 1 + lily/tuplet-bracket.cc | 23 +++++++++++++++++++ lily/tuplet-engraver.cc | 13 +++++++++++ scm/define-grob-properties.scm | 2 ++ scm/define-grobs.scm | 1 + 8 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 input/regression/tuplet-bracket-avoid-scripts.ly diff --git a/input/regression/tuplet-bracket-avoid-scripts.ly b/input/regression/tuplet-bracket-avoid-scripts.ly new file mode 100644 index 0000000000..3fc273ef2f --- /dev/null +++ b/input/regression/tuplet-bracket-avoid-scripts.ly @@ -0,0 +1,10 @@ +\version "2.15.24" + +\header { + texidoc = "Tuplet brackets avoid scripts by default. +" +} + +\relative c'' { + \times 2/3 { a8^\espressivo r a^\espressivo } +} diff --git a/input/regression/tuplet-bracket-outside-staff-priority.ly b/input/regression/tuplet-bracket-outside-staff-priority.ly index fa6b082034..2c3115a9e2 100644 --- a/input/regression/tuplet-bracket-outside-staff-priority.ly +++ b/input/regression/tuplet-bracket-outside-staff-priority.ly @@ -1,4 +1,4 @@ -\version "2.15.6" +\version "2.15.24" \header { texidoc = "Tuplet brackets' outside staff priority can be @@ -7,6 +7,7 @@ set. Brackets, by default, carry their numbers with them." } \relative c'' { + \override TupletBracket #'avoid-scripts = ##f % Plain old tuplet \times 2/3 { a8 r a } % With nothing set, collisions abound both horizontally and diff --git a/input/regression/tuplet-number-outside-staff-priority.ly b/input/regression/tuplet-number-outside-staff-priority.ly index 7b786296bd..88765fb9a8 100644 --- a/input/regression/tuplet-number-outside-staff-priority.ly +++ b/input/regression/tuplet-number-outside-staff-priority.ly @@ -1,4 +1,4 @@ -\version "2.15.1" +\version "2.15.24" \header { texidoc = "Tuplet numbers' outside staff priority can be @@ -7,6 +7,7 @@ set." } \relative c'' { + \override TupletBracket #'avoid-scripts = ##f \times 2/3 { a8\trill a\trill a\trill } \override TupletNumber #'outside-staff-priority = #1 \times 2/3 { a8\trill a\trill a\trill } diff --git a/lily/include/tuplet-bracket.hh b/lily/include/tuplet-bracket.hh index 617758cc66..8c6ab14a32 100644 --- a/lily/include/tuplet-bracket.hh +++ b/lily/include/tuplet-bracket.hh @@ -39,6 +39,7 @@ public: static void add_tuplet_bracket (Grob *me, Grob *smaller_bracket); static void get_bounds (Grob *, Grob **, Grob **); static void add_column (Grob *me, Item *); + static void add_script (Grob *me, Item *); static void add_beam (Grob *me, Grob *); static Grob *parallel_beam (Grob *me, vector const &cols, bool *equally_long); diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index c682b67b48..478d53bb2a 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -655,6 +655,22 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) number->extent (commony, Y_AXIS)[dir])); } + if (to_boolean (me->get_property ("avoid-scripts"))) + { + extract_grob_set (me, "scripts", scripts); + for (vsize i = 0; i < scripts.size (); i++) + { + if (!scripts[i]->is_live ()) + continue; + + Interval script_x (scripts[i]->extent (commonx, X_AXIS)); + Interval script_y (scripts[i]->extent (commony, Y_AXIS)); + + points.push_back (Offset (script_x.center () - x0, + script_y[dir])); + } + } + *offset = -dir * infinity_f; Real factor = (columns.size () > 1) ? 1 / (x1 - x0) : 1.0; for (vsize i = 0; i < points.size (); i++) @@ -767,6 +783,12 @@ Tuplet_bracket::add_column (Grob *me, Item *n) add_bound_item (dynamic_cast (me), n); } +void +Tuplet_bracket::add_script (Grob *me, Item *s) +{ + Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"), s); +} + void Tuplet_bracket::add_tuplet_bracket (Grob *me, Grob *bracket) { @@ -812,6 +834,7 @@ ADD_INTERFACE (Tuplet_bracket, " @code{edge-text} are printed at the edges.", /* properties */ + "avoid-scripts " "bracket-flare " "bracket-visibility " "break-overshoot " diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index c21794436c..9ff42cad61 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -64,6 +64,7 @@ protected: vector last_tuplets_; DECLARE_ACKNOWLEDGER (note_column); + DECLARE_ACKNOWLEDGER (script); DECLARE_TRANSLATOR_LISTENER (tuplet_span); virtual void finalize (); void start_translation_timestep (); @@ -207,6 +208,17 @@ Tuplet_engraver::acknowledge_note_column (Grob_info inf) } } +void +Tuplet_engraver::acknowledge_script (Grob_info inf) +{ + for (vsize j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].bracket_) + { + Item *i = dynamic_cast (inf.grob ()); + Tuplet_bracket::add_script (tuplets_[j].bracket_, i); + } +} + void Tuplet_engraver::start_translation_timestep () { @@ -233,6 +245,7 @@ Tuplet_engraver::Tuplet_engraver () } ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); +ADD_ACKNOWLEDGER (Tuplet_engraver, script); ADD_TRANSLATOR (Tuplet_engraver, /* doc */ "Catch tuplet events and generate appropriate bracket.", diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index cef87c6254..42031bbd66 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -64,6 +64,8 @@ numbered?") averaged over staves.") (avoid-note-head ,boolean? "If set, the stem of a chord does not pass through all note heads, but starts at the last note head.") + (avoid-scripts ,boolean? "If set, a tuplet bracket avoids the +scripts associated with the note heads it encompasses.") (avoid-slur ,symbol? "Method of handling slur collisions. Choices are @code{inside}, @code{outside}, @code{around}, and @code{ignore}. @code{inside} adjusts the slur if needed to keep the diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 0a9a0e7385..157055779a 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -2394,6 +2394,7 @@ (TupletBracket . ( + (avoid-scripts . #t) (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors) (cross-staff . ,ly:tuplet-bracket::calc-cross-staff) (direction . ,ly:tuplet-bracket::calc-direction) -- 2.39.2