From a26f7d159d15166ba05d99bb5e8be388f8a51a3d Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Mon, 25 Feb 2008 12:52:24 +0200 Subject: [PATCH] A few fixes for cross-staff tuplet brackets. --- lily/include/note-column.hh | 1 + lily/note-column.cc | 14 ++++++++++++++ lily/tuplet-bracket.cc | 25 +++++++++++++++---------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh index 34a30ab5dd..f29c50e66c 100644 --- a/lily/include/note-column.hh +++ b/lily/include/note-column.hh @@ -33,6 +33,7 @@ public: static void add_head (Grob *me, Grob *); static bool has_rests (Grob *me); static Grob *dot_column (Grob *me); + static Interval cross_staff_extent (Grob *me, Grob *refp); DECLARE_GROB_INTERFACE(); static Item *get_stem (Grob *); diff --git a/lily/note-column.cc b/lily/note-column.cc index b1c6b9f272..68075fc250 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -195,6 +195,20 @@ Note_column::arpeggio (Grob *me) return unsmob_grob (me->get_object ("arpeggio")); } +/* If a note-column contains a cross-staff stem then + nc->extent (Y_AXIS, refp) will not consider the extent of the stem. + If you want the extent of the stem to be included (and you are safe + from any cross-staff issues) then call this function instead. */ +Interval +Note_column::cross_staff_extent (Grob *me, Grob *refp) +{ + Interval iv = me->extent (refp, Y_AXIS); + if (Grob *s = get_stem (me)) + iv.unite (s->extent (refp, Y_AXIS)); + + return iv; +} + ADD_INTERFACE (Note_column, "Stem and noteheads combined", diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index 7caffc7cd1..cfae0b9865 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -496,7 +496,12 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) commonx = common_refpoint_of_array (tuplets, commonx, Y_AXIS); Interval staff; - if (Grob *st = Staff_symbol_referencer::get_staff_symbol (me)) + Grob *st = Staff_symbol_referencer::get_staff_symbol (me); + + /* staff-padding doesn't work correctly on cross-staff tuplets + because it only considers one staff symbol. Until this works, + disable it. */ + if (st && !to_boolean (me->get_property ("cross-staff"))) { Real pad = robust_scm2double (me->get_property ("staff-padding"), -1.0); if (pad >= 0.0) @@ -535,9 +540,9 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) Real ss = 0.5 * Staff_symbol_referencer::staff_space (me); Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0) - + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS) - my_offset; + + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS); Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0) - + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS) - my_offset; + + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS); *dy = rp - lp; points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, lp)); @@ -553,10 +558,11 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) get_bounds (me, &left_col, &right_col); if (left_col && right_col) { - Interval rv = right_col->extent (commony, Y_AXIS); - Interval lv = left_col->extent (commony, Y_AXIS); + Interval rv = Note_column::cross_staff_extent (right_col, commony); + Interval lv = Note_column::cross_staff_extent (left_col, commony); rv.unite (staff); lv.unite (staff); + Real graphical_dy = rv[dir] - lv[dir]; Slice ls = Note_column::head_positions_interval (left_col); @@ -577,11 +583,10 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) for (vsize i = 0; i < columns.size (); i++) { - Interval note_ext = columns[i]->extent (commony, Y_AXIS); - Real notey = note_ext[dir] - my_offset; - + Interval note_ext = Note_column::cross_staff_extent (columns[i], commony); Real x = columns[i]->relative_coordinate (commonx, X_AXIS) - x0; - points.push_back (Offset (x, notey)); + + points.push_back (Offset (x, note_ext[dir])); } } @@ -634,7 +639,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) for (vsize i = 0; i < points.size (); i++) { Real x = points[i][X_AXIS]; - Real tuplety = (*dy) * x * factor; + Real tuplety = (*dy) * x * factor + my_offset; if (points[i][Y_AXIS] * dir > (*offset + tuplety) * dir) *offset = points[i][Y_AXIS] - tuplety; -- 2.39.2