X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-scoring.cc;h=0e8c60cbcb61fbaa73e8b6b5ac85005761547782;hb=487f44ae4bebfe14e56bbd8a6de5e7a9aea35028;hp=6dc6b5718ac487d2a1c6256df93ea3f4420d39ac;hpb=87eedcd59f4082cb0841528ad5bc82cb1d1191e3;p=lilypond.git diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 6dc6b5718a..0e8c60cbcb 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -1,10 +1,21 @@ /* - slur-scoring.cc -- Score based slur formatting + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter - - (c) 1996--2007 Han-Wen Nienhuys + Copyright (C) 1996--2010 Han-Wen Nienhuys Jan Nieuwenhuizen + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ @@ -67,18 +78,24 @@ 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; + Grob *left_neighbor = slur_->broken_neighbor (LEFT); - if (Grob *neighbor = slur_->broken_neighbor (RIGHT)) - { - set_grob_direction (neighbor, dir_); - } + if (left_neighbor && left_neighbor->is_live ()) + return get_grob_direction (left_neighbor); + + Direction dir = get_grob_direction (slur_); + + if (Grob *right_neighbor = slur_->broken_neighbor (RIGHT)) + set_grob_direction (right_neighbor, dir); + + return dir; } Encompass_info @@ -116,7 +133,7 @@ Slur_score_state::get_encompass_info (Grob *col) const { ei.stem_ = stem->extent (common_[Y_AXIS], Y_AXIS)[dir_]; if (Grob *b = Stem::get_beam (stem)) - ei.stem_ += stem_dir * 0.5 * Beam::get_thickness (b); + ei.stem_ += stem_dir * 0.5 * Beam::get_beam_thickness (b); Interval x = stem->extent (common_[X_AXIS], X_AXIS); ei.x_ = x.is_empty () @@ -204,7 +221,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); @@ -266,14 +283,12 @@ 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; } -MAKE_SCHEME_CALLBACK(Slur, calc_control_points, 1) +MAKE_SCHEME_CALLBACK (Slur, calc_control_points, 1) SCM Slur::calc_control_points (SCM smob) { @@ -621,7 +636,7 @@ Slur_score_state::generate_avoid_offsets () const if (!xe.is_empty () && !ye.is_empty ()) - avoid.push_back (Offset (xe.center(), ye[dir_])); + avoid.push_back (Offset (xe.center (), ye[dir_])); } } return avoid;