X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-engraver.cc;h=a022660b647a8c7fe62ba23317bf87d1e852e56c;hb=58a112d5df3f1a8313ee721cea5cd9ce479e2f48;hp=cb707e300d0d61cf58fc9092cb08bbfceebc9dad;hpb=91821bd59959b1289f2d711509017a4dacebecd2;p=lilypond.git diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index cb707e300d..a022660b64 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -3,29 +3,31 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ -#include "slur.hh" -#include "note-column.hh" +#include "engraver.hh" + #include "context.hh" #include "directional-element-interface.hh" -#include "engraver.hh" +#include "international.hh" +#include "note-column.hh" +#include "slur.hh" #include "spanner.hh" #include "tie.hh" +#include "warn.hh" /* It is possible that a slur starts and ends on the same note. At least, it is for phrasing slurs: a note can be both beginning and ending of a phrase. */ - class Slur_engraver : public Engraver { Drul_array events_; Music *running_slur_start_; - Link_array slurs_; - Link_array end_slurs_; + vector slurs_; + vector end_slurs_; void set_melisma (bool); @@ -33,12 +35,13 @@ protected: virtual bool try_music (Music *); DECLARE_ACKNOWLEDGER (accidental); - DECLARE_ACKNOWLEDGER (fingering); DECLARE_ACKNOWLEDGER (dynamic_line_spanner); + DECLARE_ACKNOWLEDGER (fingering); DECLARE_ACKNOWLEDGER (note_column); DECLARE_ACKNOWLEDGER (script); DECLARE_ACKNOWLEDGER (text_script); DECLARE_ACKNOWLEDGER (tie); + DECLARE_ACKNOWLEDGER (tuplet_number); void acknowledge_extra_object (Grob_info); void stop_translation_timestep (); virtual void finalize (); @@ -83,27 +86,30 @@ void Slur_engraver::acknowledge_note_column (Grob_info info) { Grob *e = info.grob (); - for (int i = slurs_.size (); i--;) + for (vsize i = slurs_.size (); i--;) Slur::add_column (slurs_[i], e); - for (int i = end_slurs_.size (); i--;) + for (vsize i = end_slurs_.size (); i--;) Slur::add_column (end_slurs_[i], e); } void Slur_engraver::acknowledge_extra_object (Grob_info info) { + if (slurs_.empty () && end_slurs_.empty ()) + return ; + Grob *e = info.grob (); - SCM inside = e->get_property ("inside-slur"); + SCM avoid = e->get_property ("avoid-slur"); if (Tie::has_interface (e) - || to_boolean (inside)) + || avoid == ly_symbol2scm ("inside")) { - for (int i = slurs_.size (); i--;) + for (vsize i = slurs_.size (); i--;) Slur::add_extra_encompass (slurs_[i], e); - for (int i = end_slurs_.size (); i--;) + for (vsize i = end_slurs_.size (); i--;) Slur::add_extra_encompass (end_slurs_[i], e); } - else if (!to_boolean (inside) - && e->name () != "DynamicText") + else if (avoid == ly_symbol2scm ("outside") + || avoid == ly_symbol2scm ("around")) { Grob *slur = slurs_.size () ? slurs_[0] : 0; slur = (end_slurs_.size () && !slur) @@ -111,10 +117,12 @@ Slur_engraver::acknowledge_extra_object (Grob_info info) if (slur) { - e->add_offset_callback (Slur::outside_slur_callback_proc, Y_AXIS); + chain_offset_callback (e, Slur::outside_slur_callback_proc, Y_AXIS); e->set_object ("slur", slur->self_scm ()); } } + else + e->warning ("Ignoring grob for slur. avoid-slur not set?"); } void @@ -135,6 +143,13 @@ Slur_engraver::acknowledge_fingering (Grob_info info) acknowledge_extra_object (info); } +void +Slur_engraver::acknowledge_tuplet_number (Grob_info info) +{ + acknowledge_extra_object (info); +} + + void Slur_engraver::acknowledge_script (Grob_info info) { @@ -144,6 +159,7 @@ Slur_engraver::acknowledge_script (Grob_info info) void Slur_engraver::acknowledge_text_script (Grob_info info) { + // if (!info.grob ()->internal_has_interface (ly_symbol2scm ("DynamicText"))) acknowledge_extra_object (info); } @@ -172,7 +188,7 @@ Slur_engraver::process_music () slurs_.clear (); } - if (events_[START] && slurs_.is_empty ()) + if (events_[START] && slurs_.empty ()) { Music *ev = events_[START]; @@ -183,14 +199,14 @@ Slur_engraver::process_music () if (updown && !double_slurs) set_grob_direction (slur, updown); - slurs_.push (slur); + slurs_.push_back (slur); if (double_slurs) { set_grob_direction (slur, DOWN); slur = make_spanner ("Slur", events_[START]->self_scm ()); set_grob_direction (slur, UP); - slurs_.push (slur); + slurs_.push_back (slur); } } set_melisma (slurs_.size ()); @@ -205,13 +221,14 @@ Slur_engraver::stop_translation_timestep () #include "translator.icc" -ADD_ACKNOWLEDGER (Slur_engraver,accidental); -ADD_ACKNOWLEDGER (Slur_engraver,dynamic_line_spanner); -ADD_ACKNOWLEDGER (Slur_engraver,fingering) -ADD_ACKNOWLEDGER (Slur_engraver,note_column); -ADD_ACKNOWLEDGER (Slur_engraver,script); -ADD_ACKNOWLEDGER (Slur_engraver,text_script); -ADD_ACKNOWLEDGER (Slur_engraver,tie); +ADD_ACKNOWLEDGER (Slur_engraver, accidental); +ADD_ACKNOWLEDGER (Slur_engraver, dynamic_line_spanner); +ADD_ACKNOWLEDGER (Slur_engraver, fingering); +ADD_ACKNOWLEDGER (Slur_engraver, note_column); +ADD_ACKNOWLEDGER (Slur_engraver, script); +ADD_ACKNOWLEDGER (Slur_engraver, text_script); +ADD_ACKNOWLEDGER (Slur_engraver, tie); +ADD_ACKNOWLEDGER (Slur_engraver, tuplet_number); ADD_TRANSLATOR (Slur_engraver, /* doc */ "Build slur grobs from slur events", /* create */ "Slur",