X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvoice-devnull-engraver.cc;h=d580a91b2fdb46067f6edea91900004cfc3612fd;hb=8d2f9f63cfab1f75bd4da17c9112f9e25df1582a;hp=93e17d18db96610c277a063c0654cb5448472af3;hpb=287611887cd612ac84dbf10c5fe4e1a44cc56596;p=lilypond.git diff --git a/lily/voice-devnull-engraver.cc b/lily/voice-devnull-engraver.cc index 93e17d18db..d580a91b2f 100644 --- a/lily/voice-devnull-engraver.cc +++ b/lily/voice-devnull-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2002 Jan Nieuwenhuizen */ #include "engraver.hh" @@ -14,67 +14,100 @@ class Voice_devnull_engraver : public Engraver { public: - VIRTUAL_COPY_CONS (Translator); + TRANSLATOR_DECLARATIONS(Voice_devnull_engraver); protected: - virtual bool do_try_music (Music *m); - virtual void acknowledge_element (Score_element_info); + virtual bool try_music (Music *m); + virtual void acknowledge_grob (Grob_info); }; -ADD_THIS_TRANSLATOR (Voice_devnull_engraver); + static char const *eat_spanners[] = { - "beam-interface", + "beam", + "crescendo", + "decrescendo", "slur", - "dynamic-interface", - "crescendo-interface", 0 }; bool -Voice_devnull_engraver::do_try_music (Music *m) +Voice_devnull_engraver::try_music (Music *m) { - if (daddy_trans_l_->id_str_ == "two" - && (to_boolean (get_property ("unison")) - || to_boolean (get_property ("unisilence")))) + SCM s = get_property ("devNullVoice"); +#if 0 + /* No need */ + if (gh_equal_p (s, ly_symbol2scm ("never"))) + return; +#endif + + if (gh_equal_p (s, ly_symbol2scm ("allways")) + || (s == SCM_EOL + && daddy_trans_l_->id_str_.left_str (3) == "two" + && (to_boolean (get_property ("unison")) + || to_boolean (get_property ("unisilence"))))) { - for (char const **p = eat_spanners; *p; p++) + if (Span_req *s = dynamic_cast (m)) { - if (Span_req *s = dynamic_cast (m)) + SCM t = s->get_mus_property ("span-type"); + + for (char const **p = eat_spanners; *p; p++) { - if (s->span_type_str_ == *p) - { - return true; - } + if (t == ly_str02scm (*p)) + return true; } } + /* Ugh. Should eat other requests, script etc. too. */ + else if (dynamic_cast (m)) + return true; } return false; } - + static char const *junk_interfaces[] = { -#if 0 "beam-interface", -#endif + "dynamic-interface", + "hairpin-interface", + "multi-measure-rest-interface", + "script-interface", "slur-interface", - "tie-interface", + "text-interface", "text-item-interface", "text-script-interface", - "dynamic-interface", - "crescendo-interface", + "text-spanner-interface", + "tie-interface", 0 }; void -Voice_devnull_engraver::acknowledge_element (Score_element_info i) +Voice_devnull_engraver::acknowledge_grob (Grob_info i) { - if (daddy_trans_l_->id_str_ == "two" - && (to_boolean (get_property ("unison")) - || to_boolean (get_property ("unisilence")))) + SCM s = get_property ("devNullVoice"); +#if 0 + /* No need, next if will never be true */ + if (s == ly_symbol2scm ("never")) + return; +#endif + + if (s == ly_symbol2scm ("allways") + || (s == SCM_EOL + && daddy_trans_l_->id_str_.left_str (3) == "two" + && (to_boolean (get_property ("unison")) + || to_boolean (get_property ("unisilence"))))) for (char const **p = junk_interfaces; *p; p++) - if (i.elem_l_->has_interface (ly_symbol2scm (*p))) + if (i.grob_l_->has_interface (ly_symbol2scm (*p))) { - i.elem_l_->suicide (); + /* Ugh, we can suicide them, but they remain living */ + i.grob_l_->suicide (); return; } } + +Voice_devnull_engraver::Voice_devnull_engraver(){} + +ENTER_DESCRIPTION(Voice_devnull_engraver, +/* descr */ "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.", +/* creats*/ "", +/* acks */ "grob-interface", +/* reads */ "", +/* write */ "");