Am Sa., 12. Dez. 2020 um 21:07 Uhr schrieb Timothy Lanfear <timo...@lanfear.me>: > > The part of the slur before the line break is badly shaped when another > staff has a clef change. > > \version "2.20.0" > > << > \new Staff { > R1*2 > r2 r4 r8 r16 r32 e''32( | > \break > d''8) r r4 r2 | > R1*3 > } > > \new Staff { > R1*3 > \clef "bass" > R1*4 > } > >> > > > -- > Timothy Lanfear, Bristol, UK. > > _______________________________________________ > bug-lilypond mailing list > bug-lilypond@gnu.org > https://lists.gnu.org/mailman/listinfo/bug-lilypond
As far as I can tell it was introduced with commit 16a328617e867892e8d5608f95bd6127196e03a2 Author: Keith OHara <k-ohara5...@oco.net> Date: Sun Jun 17 21:45:26 2012 -0700 Consistent bounds for slurs; issue 427 and 379 in 2.15.41. I reverted it maually with below, (my C++-skils are approx. zero, all done by c/p and comments): diff --git a/lily/include/slur-scoring.hh b/lily/include/slur-scoring.hh index bddc6c3ce8..e63b23b71b 100644 --- a/lily/include/slur-scoring.hh +++ b/lily/include/slur-scoring.hh @@ -138,7 +138,8 @@ public: std::vector<Extra_collision_info> get_extra_encompass_infos () const; Real move_away_from_staffline (Real y, Grob *on_staff) const; - Interval breakable_bound_extent (Direction) const; + Grob *breakable_bound_item (Direction) const; +// Interval breakable_bound_extent (Direction) const; }; void set_slur_control_points (Grob *me); diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 8f98deedd7..93fc8ec232 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -451,12 +451,14 @@ Slur_score_state::get_best_curve () const return best; } -Interval -Slur_score_state::breakable_bound_extent (Direction d) const +Grob * +Slur_score_state::breakable_bound_item (Direction d) const +// Interval +// Slur_score_state::breakable_bound_extent (Direction d) const { Grob *paper_col = slur_->get_bound (d)->get_column (); - Interval ret; - ret.set_empty (); +// Interval ret; +// ret.set_empty (); extract_grob_set (slur_, "encompass-objects", extra_encompasses); @@ -464,10 +466,11 @@ Slur_score_state::breakable_bound_extent (Direction d) const { Item *item = dynamic_cast<Item *> (extra_encompasses[i]); if (item && paper_col == item->get_column ()) - ret.unite (robust_relative_extent (item, common_[X_AXIS], X_AXIS)); + return item; +// ret.unite (robust_relative_extent (item, common_[X_AXIS], X_AXIS)); } - - return ret; + return 0; +// return ret; } /* @@ -583,12 +586,20 @@ Slur_score_state::get_base_attachments () const Real x = 0; Real y = 0; - Interval ext = breakable_bound_extent (d); - if (ext.is_empty ()) - ext = Axis_group_interface:: - generic_bound_extent (extremes_[d].bound_, - common_[X_AXIS], X_AXIS); - x = ext[-d]; + if (Grob *g = breakable_bound_item (d)) + { + x = robust_relative_extent (g, common_[X_AXIS], X_AXIS)[RIGHT]; + } + else if (d == RIGHT) + x = robust_relative_extent (extremes_[d].bound_, common_[X_AXIS], X_AXIS)[d]; + else + x = slur_->get_broken_left_end_align (); +// Interval ext = breakable_bound_extent (d); +// if (ext.is_empty ()) +// ext = Axis_group_interface:: +// generic_bound_extent (extremes_[d].bound_, +// common_[X_AXIS], X_AXIS); +// x = ext[-d]; Grob *col = (d == LEFT) ? note_columns_[0] : note_columns_.back (); diff --git a/lily/spanner.cc b/lily/spanner.cc index 5713c13d3f..bfd5765ef5 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -324,6 +324,34 @@ Spanner::is_broken () const return broken_intos_.size (); } +/* + If this is a broken spanner, return the amount the left end is to be + shifted horizontally so that the spanner starts after the initial + clef and key on the staves. This is necessary for ties, slurs, + crescendo and decrescendo signs, for example. +*/ +Real +Spanner::get_broken_left_end_align () const +{ + Paper_column *sc = dynamic_cast<Paper_column *> (spanned_drul_[LEFT]->get_column ()); + + // Relevant only if left span point is first column in line + if (sc != NULL + && sc->break_status_dir () == RIGHT) + { + /* + We used to do a full search for the Break_align_item. + But that doesn't make a difference, since the Paper_column + is likely to contain only a Break_align_item. + */ + return sc->extent (sc, X_AXIS)[RIGHT]; + } + + return 0.0; +} + + + void Spanner::derived_mark () const { Then I used the following ly-tests: %%%% start << \new Staff { R1*2 r2 r4 r8 r16 r32 e''32( | \break d''8) r r4 r2 | R1*3 } \new Staff { R1*3 \clef "bass" R1*4 } >> %% from issue 427 \relative c'' { \key c \minor f e\( d( c~ \break c d) e\) f } %% from issue 379 \relative c'' { \key g \major \partial 4 \voiceOne g4( \break a) } %%%% end I attach images with and without the revert. While the revert fixes the reported problem, issues 427 and 379 are present again. Hopefully somebody with more knowledge, chimes in. Cheers, Harm
_______________________________________________ bug-lilypond mailing list bug-lilypond@gnu.org https://lists.gnu.org/mailman/listinfo/bug-lilypond