X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-scoring.cc;h=34e20519c96c0ea34afd3ff627abe31b7411f7d2;hb=14573cf22c37fb61eac8e3d3ea37dfa2a13f8542;hp=6b4b5699111b9abbecd1d8a4808cdcddf8ee8c42;hpb=c3153e5513e6b0ccdc226fbedd6e886d7df23a25;p=lilypond.git diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 6b4b569911..34e20519c9 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -74,12 +74,11 @@ broken_trend_y (Slur_score_state const &state, Direction hdir) Real by = 0.0; if (Spanner *mother = dynamic_cast (state.slur_->original ())) { - vsize k = broken_spanner_index (state.slur_); - int j = int (k) + hdir; - if (j < 0 || vsize (j) >= mother->broken_intos_.size ()) + Grob *neighbor = mother->broken_neighbor (hdir); + if (!neighbor) return by; - Grob *neighbor = mother->broken_intos_[j]; + Spanner *common_mother = dynamic_cast (state.common_[Y_AXIS]->original ()); int common_k @@ -108,13 +107,8 @@ Slur_score_state::set_next_direction () if (extremes_[RIGHT].note_column_) return; - if (Spanner *mother = dynamic_cast (slur_->original ())) + if (Grob *neighbor = slur_->broken_neighbor (RIGHT)) { - vsize j = 1 + broken_spanner_index (slur_); - if (j >= mother->broken_intos_.size ()) - return; - - Grob *neighbor = mother->broken_intos_[j]; set_grob_direction (neighbor, dir_); } } @@ -230,13 +224,14 @@ Slur_score_state::fill (Grob *me) slur_ = dynamic_cast (me); columns_ = internal_extract_grob_array (me, ly_symbol2scm ("note-columns")); - + if (columns_.empty ()) { me->suicide (); return; } + Slur::replace_breakable_encompass_objects (me); staff_space_ = Staff_symbol_referencer::staff_space (me); Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * lt; @@ -412,6 +407,23 @@ Slur_score_state::get_best_curve () return configurations_[opt_idx]->curve_; } +Grob * +Slur_score_state::breakable_bound_item (Direction d) const +{ + Grob *col = slur_->get_bound (d)->get_column (); + + extract_grob_set (slur_, "encompass-objects", extra_encompasses); + + for (vsize i = 0; i < extra_encompasses.size (); i++) + { + Item *item = dynamic_cast (extra_encompasses[i]); + if (item && col == item->get_column ()) + return item; + } + + return 0; +} + int Slur_score_state::get_closest_index (SCM inspect_quants) const { @@ -450,7 +462,7 @@ Slur_score_state::get_y_attachment_range () const { end_ys[d] = dir_ * max (max (dir_ * (base_attachments_[d][Y_AXIS] - + parameters_.region_size_ * dir_), + + parameters_.region_size_ * dir_), dir_ * (dir_ + extremes_[d].note_column_->extent (common_[Y_AXIS], Y_AXIS)[dir_])), dir_ * base_attachments_[-d][Y_AXIS]); } @@ -524,12 +536,18 @@ Slur_score_state::get_base_attachments () const { if (!extremes_[d].note_column_) { - Real x, y; - if (d == RIGHT) + Real x = 0; + Real y = 0; + + 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 (); - + Grob *col = (d == LEFT) ? columns_[0] : columns_.back (); if (extremes_[-d].bound_ != col)