]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/voice-devnull-engraver.cc
release: 1.4.3
[lilypond.git] / lily / voice-devnull-engraver.cc
index a6684ed45416fa1fccf517d3f06eba82daa19e81..7a8d460f99c933b672028507c5e23e1c414faa7f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
   
-  (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2001 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "engraver.hh"
@@ -17,32 +17,97 @@ public:
   VIRTUAL_COPY_CONS (Translator);
   
 protected:
-  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",
+  "crescendo",
+  "decrescendo",
+  "slur",
+  0
+};
+
+bool
+Voice_devnull_engraver::try_music (Music *m)
+{
+  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")))))
+    {
+      if (Span_req *s = dynamic_cast <Span_req *> (m))
+       {
+         SCM t = s->get_mus_property ("span-type");
+        
+         for (char const **p = eat_spanners; *p; p++)
+           {
+             if (t == ly_str02scm (*p))
+               return true;
+           }
+       }
+      /* Ugh.  Should eat other requests, script etc. too. */  
+      else if (dynamic_cast<Tie_req*> (m))
+       return true;
+    }
+  return false;
+}
+    
 static char const *junk_interfaces[] = {
-  //   "beam-interface",
+  "beam-interface",
+  "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 0
+         /* Ugh: virtual mmrest::suicide () ? */
+         if (i.elem_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface")))
+           i.elem_l_->set_grob_property ("skip-timestep", SCM_BOOL_T);
+         else
+           ;
+#endif   
+         /* Ugh, we can suicide them, but they remain living */
          i.elem_l_->suicide ();
          return;
        }
 }
+