X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Ftie-engraver.cc;h=fd236e88cb89b3a43278c6f263b879df1e4e475c;hb=4300e287a18cbc4569c79f8e8445609dc7d4546a;hp=e0649feb2dcfd4ed272dea40c411652ac18a178d;hpb=5d1ddaf889233f8e5c32a118f9e843e1becca2d2;p=lilypond.git diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index e0649feb2d..fd236e88cb 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -27,14 +27,29 @@ TODO: Remove the dependency on musical info. We should tie on the basis of position and duration-log of the heads (not of the events). */ + +struct Head_event_tuple +{ + Grob *head_; + SCM tie_definition_; + Music *event_; + Head_event_tuple() + { + } + Head_event_tuple(Grob *h, Music *m, SCM def) + { + head_ = h; + event_ = m; + tie_definition_ = def; + } +}; + class Tie_engraver : public Engraver { Music *event_; - Music *last_event_; Link_array now_heads_; - Link_array heads_to_tie_; + Array heads_to_tie_; Link_array ties_; - SCM tie_start_definition_; Spanner * tie_column_; @@ -51,19 +66,18 @@ public: }; +void +Tie_engraver::derived_mark () const +{ + Engraver::derived_mark (); + for (int i = 0; i < heads_to_tie_.size(); i++) + scm_gc_mark (heads_to_tie_[i].tie_definition_); +} Tie_engraver::Tie_engraver () { event_ = 0; - last_event_ = 0; tie_column_ = 0; - tie_start_definition_ = SCM_EOL; -} - -void -Tie_engraver::derived_mark () const -{ - scm_gc_mark (tie_start_definition_); } @@ -96,7 +110,7 @@ Tie_engraver::acknowledge_grob (Grob_info i) now_heads_.push (h); for (int i = heads_to_tie_.size (); i--;) { - Grob *th = heads_to_tie_[i]; + Grob *th = heads_to_tie_[i].head_; Music * right_mus = unsmob_music (h->get_property ("cause")); Music * left_mus = unsmob_music (th->get_property ("cause")); @@ -107,21 +121,22 @@ Tie_engraver::acknowledge_grob (Grob_info i) && ly_c_equal_p (right_mus->get_property ("pitch"), left_mus->get_property ("pitch"))) { - Grob * p = new Spanner (tie_start_definition_, context()->get_grob_key ("Tie")); - announce_grob (p, last_event_->self_scm ()); + Grob * p = new Spanner (heads_to_tie_[i].tie_definition_, + context()->get_grob_key ("Tie")); + announce_grob (p, heads_to_tie_[i].event_->self_scm ()); Tie::set_interface (p); // cannot remove yet! Tie::set_head (p, LEFT, th); Tie::set_head (p, RIGHT, h); ties_.push (p); + heads_to_tie_.del (i); } } if (ties_.size () && ! tie_column_) { - tie_column_ = make_spanner ("TieColumn", SCM_EOL); - + tie_column_ = make_spanner ("TieColumn", ties_[0]->self_scm ()); } if (tie_column_) @@ -134,7 +149,7 @@ void Tie_engraver::start_translation_timestep () { context ()->set_property ("tieMelismaBusy", - ly_bool2scm (heads_to_tie_.size ())); + ly_bool2scm (heads_to_tie_.size ())); } @@ -143,23 +158,36 @@ Tie_engraver::stop_translation_timestep () { if (ties_.size ()) { - heads_to_tie_.clear (); + if (!to_boolean (get_property ("tieWaitForNote"))) + { + heads_to_tie_.clear (); + } + for (int i = 0; i< ties_.size (); i++) { typeset_tie (ties_[i]); } ties_.clear (); - last_event_ = 0; tie_column_ = 0; } if (event_) { - tie_start_definition_ = updated_grob_properties (context (), ly_symbol2scm ("Tie")); - heads_to_tie_ = now_heads_; - last_event_ = event_; + SCM start_definition + = updated_grob_properties (context (), ly_symbol2scm ("Tie")); + + if (!to_boolean (get_property ("tieWaitForNote"))) + heads_to_tie_.clear(); + + for (int i = 0; i < now_heads_.size(); i++) + { + heads_to_tie_.push (Head_event_tuple (now_heads_[i], event_, + start_definition + )); + } } + event_ = 0; now_heads_.clear (); }