X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fphrasing-slur-engraver.cc;h=7e6c3c63fe3d8b0e026022e2ad555d767ca4dfda;hb=787b6b2f10f8038678ad5618aec10f4823962008;hp=ff1bd4e51d5d0581b4dc5a7cad08c9d6aac70262;hpb=619997f335c96cb3720f486650fd284906c90b83;p=lilypond.git diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index ff1bd4e51d..7e6c3c63fe 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -62,7 +62,7 @@ protected: DECLARE_ACKNOWLEDGER (script); DECLARE_ACKNOWLEDGER (dots); DECLARE_ACKNOWLEDGER (text_script); - DECLARE_ACKNOWLEDGER (tie); + DECLARE_END_ACKNOWLEDGER (tie); DECLARE_ACKNOWLEDGER (tuplet_number); void acknowledge_extra_object (Grob_info); @@ -83,9 +83,9 @@ Phrasing_slur_engraver::Phrasing_slur_engraver () void Phrasing_slur_engraver::derived_mark () const { - for (vsize i=start_events_.size(); i--;) + for (vsize i = start_events_.size (); i--;) scm_gc_mark (start_events_[i]->self_scm ()); - for (vsize i=stop_events_.size(); i--;) + for (vsize i = stop_events_.size (); i--;) scm_gc_mark (stop_events_[i]->self_scm ()); } @@ -156,7 +156,7 @@ Phrasing_slur_engraver::acknowledge_text_script (Grob_info info) } void -Phrasing_slur_engraver::acknowledge_tie (Grob_info info) +Phrasing_slur_engraver::acknowledge_end_tie (Grob_info info) { acknowledge_extra_object (info); } @@ -203,7 +203,7 @@ Phrasing_slur_engraver::process_music () for (vsize j = stop_events_.size (); --j > i;) { if (id == robust_scm2string (stop_events_[j]->get_property ("spanner-id"), "")) - stop_events_.erase (stop_events_.begin() + j); + stop_events_.erase (stop_events_.begin () + j); } } else @@ -218,7 +218,7 @@ Phrasing_slur_engraver::process_music () Direction updown = to_dir (ev->get_property ("direction")); bool completed; - for (vsize j = 0; !(completed = (j == slurs_.size ())); j++) + for (vsize j = slurs_.size (); !(completed = (j-- == 0));) { // Check if we already have a slur with the same spanner-id. if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")) @@ -234,31 +234,29 @@ Phrasing_slur_engraver::process_music () // If this slur event has no direction, it will not // contribute anything new to the existing slur(s), so - // we can ignore it. This is not entirely accurate: - // tweaks or context properties like those set with - // \slurUp can still override a neutral direction, so - // when encountering a slur event with "opposite" - // direction first, then one with neutral direction, we - // only let the "opposite" direction remain, while if - // the order is the other way round, a double slur - // results since the direction of the first slur is no - // longer attributable to a "neutral" slur event. A - // mixture of neutral and directed events is nothing - // that the partcombiner should crank out, and it would - // be decidedly strange for manual input. + // we can ignore it. if (!updown) break; - // If the existing slur does not have a direction yet, - // give it ours + Stream_event *c = unsmob_stream_event (slurs_[j]->get_property ("cause")); + + if (!c) + { + slurs_[j]->programming_error ("phrasing slur without a cause"); + continue; + } + + Direction slur_dir = to_dir (c->get_property ("direction")); - Direction slur_dir = to_dir (slurs_[j]->get_property ("direction")); + // If the existing slur does not have a direction yet, + // we'd rather take the new one. if (!slur_dir) { - set_grob_direction (slurs_[j], updown); - break; + slurs_[j]->suicide (); + slurs_.erase (slurs_.begin () + j); + continue; } // If the existing slur has the same direction as ours, drop ours @@ -316,7 +314,7 @@ ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tie); +ADD_END_ACKNOWLEDGER (Phrasing_slur_engraver, tie); ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); ADD_TRANSLATOR (Phrasing_slur_engraver,