X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-engraver.cc;h=2481ea41acec36ccbfdeda097faf133523706a63;hb=75eebcb49e52d296b1da3e1074e0825d2c780db4;hp=200ad5c0f3a8d82f6265224031c695fcc63ce963;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 200ad5c0f3..2481ea41ac 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -1,7 +1,9 @@ /* 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" @@ -11,13 +13,13 @@ #include "engraver.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_; @@ -29,10 +31,19 @@ class Slur_engraver : public Engraver protected: virtual bool try_music (Music *); - virtual void acknowledge_grob (Grob_info); - virtual void stop_translation_timestep (); + + DECLARE_ACKNOWLEDGER (accidental); + 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 (); - virtual void process_music (); + void process_music (); public: TRANSLATOR_DECLARATIONS (Slur_engraver); @@ -66,44 +77,95 @@ Slur_engraver::try_music (Music *m) void Slur_engraver::set_melisma (bool m) { - context ()->set_property ("slurMelismaBusy", m ? SCM_BOOL_T :SCM_BOOL_F); + context ()->set_property ("slurMelismaBusy", m ? SCM_BOOL_T : SCM_BOOL_F); } void -Slur_engraver::acknowledge_grob (Grob_info info) +Slur_engraver::acknowledge_note_column (Grob_info info) { - Grob *e = info.grob_; - if (Note_column::has_interface (info.grob_)) + Grob *e = info.grob (); + for (int i = slurs_.size (); i--;) + Slur::add_column (slurs_[i], e); + for (int i = end_slurs_.size (); i--;) + Slur::add_column (end_slurs_[i], e); +} + +void +Slur_engraver::acknowledge_extra_object (Grob_info info) +{ + if (slurs_.is_empty () + && end_slurs_.is_empty ()) + return ; + + Grob *e = info.grob (); + SCM avoid = e->get_property ("avoid-slur"); + if (Tie::has_interface (e) + || avoid == ly_symbol2scm ("inside")) { for (int i = slurs_.size (); i--;) - Slur::add_column (slurs_[i], e); + Slur::add_extra_encompass (slurs_[i], e); for (int i = end_slurs_.size (); i--;) - Slur::add_column (end_slurs_[i], e); + Slur::add_extra_encompass (end_slurs_[i], e); } - else + else if (avoid == ly_symbol2scm ("outside") + || avoid == ly_symbol2scm ("around")) { - SCM inside = e->get_property ("inside-slur"); - if (Tie::has_interface (e) - || to_boolean (inside)) - { - for (int i = slurs_.size (); i--;) - Slur::add_extra_encompass (slurs_[i], e); - for (int i = end_slurs_.size (); i--;) - Slur::add_extra_encompass (end_slurs_[i], e); - } - else if (inside == SCM_BOOL_F) + Grob *slur = slurs_.size () ? slurs_[0] : 0; + slur = (end_slurs_.size () && !slur) + ? end_slurs_[0] : slur; + + if (slur) { - Grob *slur = slurs_.size ()?slurs_[0] : 0; - slur = (end_slurs_.size () && !slur) - ? end_slurs_[0] : slur; - - if (slur) - { - e->add_offset_callback (Slur::outside_slur_callback_proc, Y_AXIS); - e->set_property ("slur", slur->self_scm ()); - } + 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 +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) +{ + 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) +{ + acknowledge_extra_object (info); +} + +void +Slur_engraver::acknowledge_text_script (Grob_info info) +{ + // if (!info.grob ()->internal_has_interface (ly_symbol2scm ("DynamicText"))) + acknowledge_extra_object (info); +} + +void +Slur_engraver::acknowledge_tie (Grob_info info) +{ + acknowledge_extra_object (info); } void @@ -119,9 +181,7 @@ Slur_engraver::process_music () if (events_[STOP]) { if (slurs_.size () == 0) - { - events_[STOP]->origin ()->warning (_ ("No slur to end")); - } + events_[STOP]->origin ()->warning (_ ("can't end slur")); end_slurs_ = slurs_; slurs_.clear (); @@ -158,10 +218,19 @@ Slur_engraver::stop_translation_timestep () events_[START] = events_[STOP] = 0; } +#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, tuplet_number); ADD_TRANSLATOR (Slur_engraver, - /* descr */ "Build slurs grobs from slur events", - /* creats*/ "Slur", - /* accepts */ "slur-event", - /* acks */ "note-column-interface accidental-interface fingering-interface script-interface tie-interface text-script-interface", - /* reads */ "slurMelismaBusy doubleSlurs", + /* doc */ "Build slur grobs from slur events", + /* create */ "Slur", + /* accept */ "slur-event", + /* read */ "slurMelismaBusy doubleSlurs", /* write */ "");