From 5593f79a3b3ea017c3a6908dcd55ba1873959d6f Mon Sep 17 00:00:00 2001 From: Patrick McCarty Date: Wed, 28 Apr 2010 19:25:56 -0700 Subject: [PATCH] Fix #943. - Currently, slur direction is calculated once and possibly modified later. Combine these routines into a single function. - Check for a post-line-break slur first; in this case, the direction should come from the pre-line-break slur. - Check for a pre-line-break slur next; if found, forward its direction to the corresponding post-line-break slur. - If these conditions do not hold, we have an unbroken slur, so simply calculate its direction. --- lily/include/slur-scoring.hh | 2 +- lily/slur-scoring.cc | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lily/include/slur-scoring.hh b/lily/include/slur-scoring.hh index aeaac19c84..6348125cc9 100644 --- a/lily/include/slur-scoring.hh +++ b/lily/include/slur-scoring.hh @@ -107,7 +107,7 @@ struct Slur_score_state Bezier get_best_curve (); void fill (Grob *); - void set_next_direction (); + Direction slur_direction () const; vector generate_avoid_offsets () const; Drul_array get_bound_info () const; diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 5182072a03..a43daa3ed4 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -78,18 +78,22 @@ Slur_score_state::~Slur_score_state () } /* - copy slur dir forwards across line break. + If a slur is broken across a line break, the direction + of the post-break slur must be the same as the pre-break + slur. */ -void -Slur_score_state::set_next_direction () +Direction +Slur_score_state::slur_direction () const { - if (extremes_[RIGHT].note_column_) - return; + if (Grob *left_neighbor = slur_->broken_neighbor (LEFT)) + return get_grob_direction (left_neighbor); - if (Grob *neighbor = slur_->broken_neighbor (RIGHT)) - { - set_grob_direction (neighbor, dir_); - } + Direction dir = get_grob_direction (slur_); + + if (Grob *right_neighbor = slur_->broken_neighbor (RIGHT)) + set_grob_direction (right_neighbor, dir); + + return dir; } Encompass_info @@ -215,7 +219,7 @@ Slur_score_state::fill (Grob *me) Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * lt; - dir_ = get_grob_direction (me); + dir_ = slur_direction (); parameters_.fill (me); extract_grob_set (me, "note-columns", columns); @@ -277,8 +281,6 @@ Slur_score_state::fill (Grob *me) = (extremes_[LEFT].stem_ && Stem::get_beam (extremes_[LEFT].stem_)) || (extremes_[RIGHT].stem_ && Stem::get_beam (extremes_[RIGHT].stem_)); - set_next_direction (); - if (is_broken_) musical_dy_ = 0.0; } -- 2.39.5