]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/completion-note-heads-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / completion-note-heads-engraver.cc
index 9a72b6d5ed077495addb33a1fa82ea63b4c91676..6fe80dc30949e0bfb9638141c79bfd93c55ffdd5 100644 (file)
@@ -7,22 +7,20 @@
 #include <cctype>
 using namespace std;
 
-#include "dot-column.hh"
+#include "rhythmic-head.hh"
+#include "output-def.hh"
+#include "music.hh"
 #include "dots.hh"
-#include "duration.hh"
-#include "global-context.hh"
+#include "dot-column.hh"
+#include "staff-symbol-referencer.hh"
 #include "item.hh"
-#include "output-def.hh"
-#include "pitch.hh"
-#include "rhythmic-head.hh"
 #include "score-engraver.hh"
+#include "warn.hh"
 #include "spanner.hh"
-#include "staff-symbol-referencer.hh"
-#include "stream-event.hh"
 #include "tie.hh"
-#include "warn.hh"
-
-#include "translator.icc"
+#include "global-context.hh"
+#include "duration.hh"
+#include "pitch.hh"
 
 /*
   TODO: make matching rest engraver.
@@ -50,8 +48,8 @@ class Completion_heads_engraver : public Engraver
   vector<Grob*> ties_;
 
   vector<Item*> dots_;
-  vector<Stream_event*> note_events_;
-  vector<Stream_event*> scratch_note_events_;
+  vector<Music*> note_events_;
+  vector<Music*> scratch_note_events_;
 
   Moment note_end_mom_;
   bool is_first_;
@@ -67,9 +65,9 @@ public:
 protected:
   virtual void initialize ();
   void start_translation_timestep ();
+  virtual bool try_music (Music *event);
   void process_music ();
   void stop_translation_timestep ();
-  DECLARE_TRANSLATOR_LISTENER (note);
 };
 
 void
@@ -78,24 +76,31 @@ Completion_heads_engraver::initialize ()
   is_first_ = false;
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note);
-void
-Completion_heads_engraver::listen_note (Stream_event *ev)
+bool
+Completion_heads_engraver::try_music (Music *m)
 {
-  note_events_.push_back (ev);
-  
-  is_first_ = true;
-  Moment musiclen = get_event_length (ev);
-  Moment now = now_mom ();
-
-  if (now_mom ().grace_part_)
+  if (m->is_mus_type ("note-event"))
     {
-      musiclen.grace_part_ = musiclen.main_part_;
-      musiclen.main_part_ = Rational (0, 1);
+      note_events_.push_back (m);
+
+      is_first_ = true;
+      Moment musiclen = m->get_length ();
+      Moment now = now_mom ();
+
+      if (now_mom ().grace_part_)
+       {
+         musiclen.grace_part_ = musiclen.main_part_;
+         musiclen.main_part_ = Rational (0, 1);
+       }
+      note_end_mom_ = max (note_end_mom_, (now + musiclen));
+      do_nothing_until_ = Rational (0, 0);
+
+      return true;
     }
+  else if (m->is_mus_type ("busy-playing-event"))
+    return note_events_.size () && is_first_;
 
-  note_end_mom_ = max (note_end_mom_, (now + musiclen));
-  do_nothing_until_ = Rational (0, 0);
+  return false;
 }
 
 /*
@@ -189,14 +194,14 @@ Completion_heads_engraver::process_music ()
       if (!scratch_note_events_.size ())
        for (vsize i = 0; i < note_events_.size (); i++)
          {
-           Stream_event *m = note_events_[i]->clone ();
+           Music *m = note_events_[i]->clone ();
            scratch_note_events_.push_back (m);
          }
     }
 
   for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++)
     {
-      Stream_event *event = note_events_[i];
+      Music *event = note_events_[i];
       if (scratch_note_events_.size ())
        {
          event = scratch_note_events_[i];
@@ -216,7 +221,11 @@ Completion_heads_engraver::process_music ()
          Item *d = make_item ("Dots", SCM_EOL);
          Rhythmic_head::set_dots (note, d);
 
-         d->set_property ("dot-count", scm_from_int (dots));
+         /*
+           measly attempt to save an eeny-weenie bit of memory.
+         */
+         if (dots != scm_to_int (d->get_property ("dot-count")))
+           d->set_property ("dot-count", scm_from_int (dots));
 
          d->set_parent (note, Y_AXIS);
          dots_.push_back (d);
@@ -287,19 +296,13 @@ Completion_heads_engraver::Completion_heads_engraver ()
 {
 }
 
+#include "translator.icc"
+
 ADD_TRANSLATOR (Completion_heads_engraver,
                /* doc */ "This engraver replaces "
                "@code{Note_heads_engraver}. It plays some trickery to "
                "break long notes and automatically tie them into the next measure.",
-               /* create */
-               "NoteHead "
-               "Dots "
-               "Tie",
-
-               /* accept */ "note-event",
-               /* read */
-               "middleCPosition "
-               "measurePosition "
-               "measureLength",
-
+               /* create */ "NoteHead Dots Tie",
+               /* accept */ "busy-playing-event note-event",
+               /* read */ "middleCPosition measurePosition measureLength",
                /* write */ "");