X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-engraver.cc;h=a022660b647a8c7fe62ba23317bf87d1e852e56c;hb=052eddb409fd6b556fbf2bcd37c9ab07f226a154;hp=8b556267a06248f6035216467a247575fd7b5cfe;hpb=811be522d0b79493159f47789e5621dc85493495;p=lilypond.git diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 8b556267a0..a022660b64 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -1,41 +1,47 @@ /* slur-engraver.cc -- implement Slur_engraver - (c) 1997--2005 Han-Wen Nienhuys + source file of the GNU LilyPond music typesetter + + (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); protected: virtual bool try_music (Music *); - DECLARE_ACKNOWLEDGER (note_column); DECLARE_ACKNOWLEDGER (accidental); + DECLARE_ACKNOWLEDGER (dynamic_line_spanner); DECLARE_ACKNOWLEDGER (fingering); + DECLARE_ACKNOWLEDGER (note_column); DECLARE_ACKNOWLEDGER (script); - DECLARE_ACKNOWLEDGER (tie); DECLARE_ACKNOWLEDGER (text_script); + DECLARE_ACKNOWLEDGER (tie); + DECLARE_ACKNOWLEDGER (tuplet_number); void acknowledge_extra_object (Grob_info); void stop_translation_timestep (); virtual void finalize (); @@ -80,26 +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) { - Grob*e = info.grob (); - SCM inside = e->get_property ("inside-slur"); + if (slurs_.empty () && end_slurs_.empty ()) + return ; + + Grob *e = info.grob (); + 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 (inside == SCM_BOOL_F) + else if (avoid == ly_symbol2scm ("outside") + || avoid == ly_symbol2scm ("around")) { Grob *slur = slurs_.size () ? slurs_[0] : 0; slur = (end_slurs_.size () && !slur) @@ -107,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 @@ -119,6 +131,11 @@ Slur_engraver::acknowledge_accidental (Grob_info info) acknowledge_extra_object (info); } +void +Slur_engraver::acknowledge_dynamic_line_spanner (Grob_info info) +{ + acknowledge_extra_object (info); +} void Slur_engraver::acknowledge_fingering (Grob_info info) @@ -126,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) { @@ -135,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); } @@ -144,9 +169,6 @@ Slur_engraver::acknowledge_tie (Grob_info info) acknowledge_extra_object (info); } - - - void Slur_engraver::finalize () { @@ -166,7 +188,7 @@ Slur_engraver::process_music () slurs_.clear (); } - if (events_[START] && slurs_.is_empty ()) + if (events_[START] && slurs_.empty ()) { Music *ev = events_[START]; @@ -177,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 ()); @@ -199,15 +221,17 @@ Slur_engraver::stop_translation_timestep () #include "translator.icc" -ADD_ACKNOWLEDGER (Slur_engraver,note_column); -ADD_ACKNOWLEDGER (Slur_engraver,accidental); -ADD_ACKNOWLEDGER (Slur_engraver,fingering) -ADD_ACKNOWLEDGER (Slur_engraver,script); -ADD_ACKNOWLEDGER (Slur_engraver,tie); -ADD_ACKNOWLEDGER (Slur_engraver,text_script); +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, - /* descr */ "Build slurs grobs from slur events", - /* creats*/ "Slur", - /* accepts */ "slur-event", - /* reads */ "slurMelismaBusy doubleSlurs", + /* doc */ "Build slur grobs from slur events", + /* create */ "Slur", + /* accept */ "slur-event", + /* read */ "slurMelismaBusy doubleSlurs", /* write */ "");