]> 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 88ca639052a112bd4cf57765ffc7ad4d2df9be7c..6fe80dc30949e0bfb9638141c79bfd93c55ffdd5 100644 (file)
@@ -1,10 +1,11 @@
 /*
   completion-note-heads-engraver.cc -- Completion_heads_engraver
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cctype>
+using namespace std;
 
 #include "rhythmic-head.hh"
 #include "output-def.hh"
@@ -21,8 +22,6 @@
 #include "duration.hh"
 #include "pitch.hh"
 
-
-
 /*
   TODO: make matching rest engraver.
 */
   longer than what's specified, than what is left to do and it should
   not cross barlines.
 
-  We copy the reqs into scratch note reqs, to make sure that we get
+  We copy the events into scratch note events, to make sure that we get
   all durations exactly right.
 */
 
 class Completion_heads_engraver : public Engraver
 {
-  Link_array<Item> notes_;
-  Link_array<Item> prev_notes_;
-  Link_array<Grob> ties_;
+  vector<Item*> notes_;
+  vector<Item*> prev_notes_;
+  vector<Grob*> ties_;
 
-  Link_array<Item> dots_;
-  Link_array<Music> note_reqs_;
-  Link_array<Music> scratch_note_reqs_;
+  vector<Item*> dots_;
+  vector<Music*> note_events_;
+  vector<Music*> scratch_note_events_;
 
   Moment note_end_mom_;
   bool is_first_;
@@ -65,10 +64,10 @@ public:
 
 protected:
   virtual void initialize ();
-  virtual void start_translation_timestep ();
-  virtual bool try_music (Music *req);
-  virtual void process_music ();
-  virtual void stop_translation_timestep ();
+  void start_translation_timestep ();
+  virtual bool try_music (Music *event);
+  void process_music ();
+  void stop_translation_timestep ();
 };
 
 void
@@ -82,7 +81,7 @@ Completion_heads_engraver::try_music (Music *m)
 {
   if (m->is_mus_type ("note-event"))
     {
-      note_reqs_.push (m);
+      note_events_.push_back (m);
 
       is_first_ = true;
       Moment musiclen = m->get_length ();
@@ -99,9 +98,7 @@ Completion_heads_engraver::try_music (Music *m)
       return true;
     }
   else if (m->is_mus_type ("busy-playing-event"))
-    {
-      return note_reqs_.size () && is_first_;
-    }
+    return note_events_.size () && is_first_;
 
   return false;
 }
@@ -141,9 +138,7 @@ Completion_heads_engraver::find_nearest_duration (Rational length)
          continue;
        }
       else
-       {
-         d = Duration (d.duration_log () + 1, 2);
-       }
+       d = Duration (d.duration_log () + 1, 2);
     }
 
   if (d.duration_log () >= log_limit)
@@ -173,12 +168,10 @@ Completion_heads_engraver::process_music ()
   Duration note_dur;
   Duration *orig = 0;
   if (left_to_do_)
-    {
-      note_dur = find_nearest_duration (left_to_do_);
-    }
+    note_dur = find_nearest_duration (left_to_do_);
   else
     {
-      orig = unsmob_duration (note_reqs_[0]->get_property ("duration"));
+      orig = unsmob_duration (note_events_[0]->get_property ("duration"));
       note_dur = *orig;
     }
   Moment nb = next_barline_moment ();
@@ -194,36 +187,33 @@ Completion_heads_engraver::process_music ()
     }
 
   if (orig)
-    {
-      left_to_do_ = orig->get_length ();
-    }
+    left_to_do_ = orig->get_length ();
 
   if (orig && note_dur.get_length () != orig->get_length ())
     {
-      if (!scratch_note_reqs_.size ())
-       for (int i = 0; i < note_reqs_.size (); i++)
+      if (!scratch_note_events_.size ())
+       for (vsize i = 0; i < note_events_.size (); i++)
          {
-           Music *m = note_reqs_[i]->clone ();
-           scratch_note_reqs_.push (m);
+           Music *m = note_events_[i]->clone ();
+           scratch_note_events_.push_back (m);
          }
     }
 
-  for (int i = 0;
-       left_to_do_ && i < note_reqs_.size (); i++)
+  for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++)
     {
-      Music *req = note_reqs_[i];
-      if (scratch_note_reqs_.size ())
+      Music *event = note_events_[i];
+      if (scratch_note_events_.size ())
        {
-         req = scratch_note_reqs_[i];
-         SCM pits = note_reqs_[i]->get_property ("pitch");
-         req->set_property ("pitch", pits);
+         event = scratch_note_events_[i];
+         SCM pits = note_events_[i]->get_property ("pitch");
+         event->set_property ("pitch", pits);
        }
 
-      req->set_property ("duration", note_dur.smobbed_copy ());
+      event->set_property ("duration", note_dur.smobbed_copy ());
 
-      Item *note = make_item ("NoteHead", req->self_scm ());
+      Item *note = make_item ("NoteHead", event->self_scm ());
       note->set_property ("duration-log",
-                         scm_int2num (note_dur.duration_log ()));
+                         scm_from_int (note_dur.duration_log ()));
 
       int dots = note_dur.dot_count ();
       if (dots)
@@ -235,34 +225,32 @@ Completion_heads_engraver::process_music ()
            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_int2num (dots));
+           d->set_property ("dot-count", scm_from_int (dots));
 
          d->set_parent (note, Y_AXIS);
-         dots_.push (d);
+         dots_.push_back (d);
        }
 
-      Pitch *pit = unsmob_pitch (req->get_property ("pitch"));
+      Pitch *pit = unsmob_pitch (event->get_property ("pitch"));
 
       int pos = pit->steps ();
       SCM c0 = get_property ("middleCPosition");
       if (scm_is_number (c0))
        pos += scm_to_int (c0);
 
-      note->set_property ("staff-position", scm_int2num (pos));
-      notes_.push (note);
+      note->set_property ("staff-position", scm_from_int (pos));
+      notes_.push_back (note);
     }
 
   if (prev_notes_.size () == notes_.size ())
     {
-      for (int i = 0; i < notes_.size (); i++)
+      for (vsize i = 0; i < notes_.size (); i++)
        {
          Grob *p = make_spanner ("Tie", SCM_EOL);
-         Tie::set_interface (p); // cannot remove yet!
-
          Tie::set_head (p, LEFT, prev_notes_[i]);
          Tie::set_head (p, RIGHT, notes_[i]);
 
-         ties_.push (p);
+         ties_.push_back (p);
        }
     }
 
@@ -273,9 +261,7 @@ Completion_heads_engraver::process_music ()
   */
   if (orig
       && now_mom ().grace_part_)
-    {
-      left_to_do_ = Rational (0, 0);
-    }
+    left_to_do_ = Rational (0, 0);
 }
 
 void
@@ -289,12 +275,10 @@ Completion_heads_engraver::stop_translation_timestep ()
 
   dots_.clear ();
 
-  for (int i = scratch_note_reqs_.size (); i--;)
-    {
-      scm_gc_unprotect_object (scratch_note_reqs_[i]->self_scm ());
-    }
+  for (vsize i = scratch_note_events_.size (); i--;)
+    scratch_note_events_[i]->unprotect ();
 
-  scratch_note_reqs_.clear ();
+  scratch_note_events_.clear ();
 }
 
 void
@@ -303,7 +287,7 @@ Completion_heads_engraver::start_translation_timestep ()
   Moment now = now_mom ();
   if (note_end_mom_.main_part_ <= now.main_part_)
     {
-      note_reqs_.clear ();
+      note_events_.clear ();
       prev_notes_.clear ();
     }
 }
@@ -312,12 +296,13 @@ Completion_heads_engraver::Completion_heads_engraver ()
 {
 }
 
+#include "translator.icc"
+
 ADD_TRANSLATOR (Completion_heads_engraver,
-               /* descr */ "This engraver replaces "
+               /* doc */ "This engraver replaces "
                "@code{Note_heads_engraver}. It plays some trickery to "
                "break long notes and automatically tie them into the next measure.",
-               /* creats*/ "NoteHead Dots Tie",
-               /* accepts */ "busy-playing-event note-event",
-               /* acks  */ "",
-               /* reads */ "middleCPosition measurePosition measureLength",
+               /* create */ "NoteHead Dots Tie",
+               /* accept */ "busy-playing-event note-event",
+               /* read */ "middleCPosition measurePosition measureLength",
                /* write */ "");