From: Jan Nieuwenhuizen Date: Sat, 30 Sep 2000 23:58:00 +0000 (+0200) Subject: patch::: 1.3.91.jcn1 X-Git-Tag: release/1.3.92~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0faba210842f1b0dd3863bfa6e2238bfa7384ba5;p=lilypond.git patch::: 1.3.91.jcn1 1.3.91.jcn1 =========== * Abort all running spanners when part-combiner combines voices. --- diff --git a/CHANGES b/CHANGES index 79bdc9e7cd..9b04a9f385 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +1.3.91.jcn1 +=========== + +* Abort all running spanners when part-combiner combines voices. + 1.3.90.jcn1 =========== diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely index 127f991038..f0db906fb6 100644 --- a/Documentation/regression-test.tely +++ b/Documentation/regression-test.tely @@ -8,7 +8,7 @@ @title LilyPond Regression test @end ignore -@node Top, , , +@node Top, , , (dir) @section Introduction diff --git a/VERSION b/VERSION index f34eb289b7..e8eabc10d0 100644 --- a/VERSION +++ b/VERSION @@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 PATCH_LEVEL=91 -MY_PATCH_LEVEL=tca2 +MY_PATCH_LEVEL=jcn1 # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index a4ffe9a519..25ab6a735e 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -66,29 +66,38 @@ Beam_engraver::do_try_music (Music *m) { if (Span_req * c = dynamic_cast(m)) { - if (c->span_type_str_ != "beam") - return false; - - Direction d =c->span_dir_; - - if (d == STOP && !beam_p_) + if (c->span_type_str_ == "abort") { - m->origin ()->warning (_ ("can't find start of beam")); - return false; + reqs_drul_[START] = 0; + reqs_drul_[STOP] = 0; + if (beam_p_) + beam_p_->suicide (); + beam_p_ = 0; } - - if(d == STOP) + else if (c->span_type_str_ == "beam") { - SCM m = get_property ("automaticMelismata"); - SCM b = get_property("noAutoBeaming"); - if (to_boolean (m) && to_boolean(b)) + + Direction d =c->span_dir_; + + if (d == STOP && !beam_p_) { - set_melisma (false); + m->origin ()->warning (_ ("can't find start of beam")); + return false; } - } - reqs_drul_[d ] = c; - return true; + if(d == STOP) + { + SCM m = get_property ("automaticMelismata"); + SCM b = get_property("noAutoBeaming"); + if (to_boolean (m) && to_boolean(b)) + { + set_melisma (false); + } + } + + reqs_drul_[d ] = c; + return true; + } } return false; } diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index bdd8f8e656..e0788f08e5 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -100,7 +100,15 @@ Dynamic_engraver::do_try_music (Music * m) } else if (Span_req* s = dynamic_cast (m)) { - if ((s->span_type_str_ == "crescendo" + if (s->span_type_str_ == "abort") + { + accepted_spanreqs_drul_[LEFT] = 0; + accepted_spanreqs_drul_[RIGHT] = 0; + if (line_spanner_) + line_spanner_->suicide (); + line_spanner_ = 0; + } + else if ((s->span_type_str_ == "crescendo" || s->span_type_str_ == "decrescendo")) { accepted_spanreqs_drul_[s->span_dir_] = s; diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 754b1023bb..498f0fc831 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -325,6 +325,26 @@ Part_combine_music_iterator::process (Moment m) else if (state & (UNIRHYTHM | UNISILENCE)) combine_b = true; + /* + When combining, abort all running spanners + */ + if (combine_b && combine_b != previously_combined_b) + { +#if 0 + // Urg: Error in unknown function during GC: rogue pointer in heap + // Who deletes this 'pointer'? + Span_req abort; + abort.span_type_str_ = "abort"; + if (second_iter_p_ && second_iter_p_->ok ()) + second_translator->try_music (&abort); +#else + Span_req* abort = new Span_req; + abort->span_type_str_ = "abort"; + if (second_iter_p_ && second_iter_p_->ok ()) + second_iter_p_->try_music (abort); +#endif + } + if (combine_b != previously_combined_b) change_to (second_iter_p_, p->what_str_, (combine_b ? "one" : "two") + suffix_); diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 763d77a3e5..8fe4f5de85 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -13,13 +13,15 @@ #include "engraver.hh" #include "spanner.hh" -class Slur_engraver :public Engraver { +class Slur_engraver : public Engraver +{ Link_array requests_arr_; Link_array new_slur_req_l_arr_; Link_array slur_l_stack_; Link_array end_slur_l_arr_; void set_melisma (bool); + protected: virtual bool do_try_music (Music*); virtual void do_process_music (); @@ -30,7 +32,6 @@ protected: public: VIRTUAL_COPY_CONS (Translator); - }; bool @@ -38,11 +39,26 @@ Slur_engraver::do_try_music (Music *req_l) { if (Span_req *sl = dynamic_cast (req_l)) { - if (sl->span_type_str_ != "slur") - return false; - new_slur_req_l_arr_.push (sl); - - return true; + if (sl->span_type_str_ == "abort") + { + for (int i = 0; i < slur_l_stack_.size (); i++) + { + slur_l_stack_[i]->suicide (); + } + slur_l_stack_.clear (); + for (int i = 0; i < end_slur_l_arr_.size (); i++) + { + end_slur_l_arr_[i]->suicide (); + } + end_slur_l_arr_.clear (); + requests_arr_.clear (); + new_slur_req_l_arr_.clear (); + } + else if (sl->span_type_str_ == "slur") + { + new_slur_req_l_arr_.push (sl); + return true; + } } return false; } @@ -93,7 +109,7 @@ Slur_engraver::do_removal_processing () void Slur_engraver::do_process_music () { - Link_array start_slur_l_arr_; + Link_array start_slur_l_arr; for (int i=0; i< new_slur_req_l_arr_.size (); i++) { Span_req* slur_req_l = new_slur_req_l_arr_[i]; @@ -125,13 +141,13 @@ Slur_engraver::do_process_music () { index_set_cell (slur->get_elt_property ("attachment"), START, s); } - start_slur_l_arr_.push (slur); + start_slur_l_arr.push (slur); requests_arr_.push (slur_req_l); announce_element (slur, slur_req_l); } } - for (int i=0; i < start_slur_l_arr_.size (); i++) - slur_l_stack_.push (start_slur_l_arr_[i]); + for (int i=0; i < start_slur_l_arr.size (); i++) + slur_l_stack_.push (start_slur_l_arr[i]); } void