]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / figured-bass-engraver.cc
index cf3e418883a9f51f74f88eea6dd5b4cad4721d5a..01b352f28d647f067eab52bb7f2b4fd42f9944d0 100644 (file)
@@ -9,15 +9,16 @@
 
 #include "engraver.hh"
 
-#include "align-interface.hh"
-#include "axis-group-interface.hh"
 #include "context.hh"
-#include "grob-array.hh"
+#include "music.hh"
 #include "item.hh"
-#include "pointer-group-interface.hh"
 #include "spanner.hh"
-#include "stream-event.hh"
+#include "axis-group-interface.hh"
+#include "align-interface.hh"
+#include "pointer-group-interface.hh"
 #include "text-interface.hh"
+#include "grob-array.hh"
+
 
 #include "translator.icc"
 
@@ -30,7 +31,7 @@ struct Figure_group
   SCM alteration_;
   
   Item *figure_item_; 
-  Stream_event *current_event_;
+  Music *current_music_;
   bool force_no_continuation_;
   
   Figure_group ()
@@ -41,17 +42,17 @@ struct Figure_group
     number_ = SCM_EOL;
     alteration_ = SCM_EOL;
     group_ = 0;
-    current_event_ = 0;
+    current_music_ = 0;
   }
   bool is_continuation () const
   {
     return
-      current_event_
+      current_music_
       && !force_no_continuation_
       && ly_is_equal (number_,
-                     current_event_->get_property ("figure"))
+                     current_music_->get_property ("figure"))
       && ly_is_equal (alteration_,
-                     current_event_->get_property ("alteration"));
+                     current_music_->get_property ("alteration"));
   }
 };
 
@@ -67,16 +68,14 @@ struct Figured_bass_engraver : public Engraver
 protected:
   vector<Figure_group> groups_;
   Spanner *alignment_;
-  vector<Stream_event *> new_events_;
+  vector<Music*> new_musics_;
   bool continuation_;
-  bool new_event_found_;
+  bool new_music_found_;
   
   Moment stop_moment_;
-  Stream_event *rest_event_; 
-
-  DECLARE_TRANSLATOR_LISTENER (rest);
-  DECLARE_TRANSLATOR_LISTENER (bass_figure);
-
+  Music *rest_event_; 
+  
+  virtual bool try_music (Music *);
   virtual void derived_mark () const; 
 
   void start_translation_timestep ();
@@ -104,7 +103,7 @@ Figured_bass_engraver::stop_translation_timestep ()
   
   bool found = false;
   for (vsize i = 0; !found && i < groups_.size (); i++)
-    found  = found  || groups_[i].current_event_;
+    found  = found  || groups_[i].current_music_;
 
   if (!found)
     clear_spanners ();
@@ -115,7 +114,7 @@ Figured_bass_engraver::Figured_bass_engraver ()
   alignment_ = 0;
   continuation_ = false;
   rest_event_ = 0;
-  new_event_found_ = false;
+  new_music_found_ = false;
 }
 
 void
@@ -126,47 +125,43 @@ Figured_bass_engraver::start_translation_timestep ()
     return ;
   
   rest_event_ = 0;
-  new_events_.clear ();
+  new_musics_.clear ();
   for (vsize i = 0; i < groups_.size (); i++)
-    groups_[i].current_event_ = 0;
-
+    groups_[i].current_music_ = 0;
   continuation_ = false;
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest);
-void
-Figured_bass_engraver::listen_rest (Stream_event *ev)
+bool
+Figured_bass_engraver::try_music (Music *m)
 {
-  if (to_boolean (get_property ("ignoreFiguredBassRest")))
+  new_music_found_ = true;
+  if (m->is_mus_type ("rest-event"))
     {
-      new_event_found_ = true;
-      ASSIGN_EVENT_ONCE (rest_event_, ev);
+      rest_event_ = m;
+      return true;
     }
-}
-
-IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure);
-void
-Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
-{
-  new_event_found_ = true;
-  Moment stop  = now_mom () + get_event_length (ev);
-  stop_moment_ = max (stop_moment_, stop);
-
-  SCM fig = ev->get_property ("figure");
-  for (vsize i = 0; i < groups_.size (); i++)
+  else
     {
-      if (!groups_[i].current_event_
-         && ly_is_equal (groups_[i].number_, fig))
+      stop_moment_ = now_mom () + m->get_length ();
+     
+      SCM fig = m->get_property ("figure");
+      for (vsize i = 0; i < groups_.size (); i++)
        {
-         groups_[i].current_event_ = ev;
-         groups_[i].force_no_continuation_
-           = to_boolean (ev->get_property ("no-continuation"));
-         continuation_ = true;
-         return; 
+         if (!groups_[i].current_music_
+             && ly_is_equal (groups_[i].number_, fig))
+           {
+             groups_[i].current_music_ = m;
+             groups_[i].force_no_continuation_
+               = to_boolean (m->get_property ("no-continuation"));
+             continuation_ = true;
+             return true; 
+           }
        }
+
+      new_musics_.push_back (m);
+
+      return true;
     }
-  
-  new_events_.push_back (ev);
 }
 
 void
@@ -249,20 +244,20 @@ Figured_bass_engraver::add_brackets ()
   bool inside = false;
   for (vsize i = 0; i < groups_.size (); i ++)
     {
-      if (!groups_[i].current_event_)
+      if (!groups_[i].current_music_)
        continue;
       
-      if (to_boolean (groups_[i].current_event_->get_property ("bracket-start")))      
+      if (to_boolean (groups_[i].current_music_->get_property ("bracket-start")))      
        inside = true;
 
       if (inside && groups_[i].figure_item_)
        encompass.push_back (groups_[i].figure_item_);
 
-       if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop")))
+       if (to_boolean (groups_[i].current_music_->get_property ("bracket-stop")))
        {
          inside = false;
 
-         Item * brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ());
+         Item * brack = make_item ("BassFigureBracket", groups_[i].current_music_->self_scm ());
          for (vsize j = 0; j < encompass.size (); j++)
            {
              Pointer_group_interface::add_grob (brack,
@@ -285,17 +280,17 @@ Figured_bass_engraver::process_music ()
     }
   
   if (!continuation_
-      && new_events_.empty ())
+      && new_musics_.empty ())
     {
       clear_spanners ();
       groups_.clear ();
       return;
     }
 
-  if (!new_event_found_)
+  if (!new_music_found_)
     return;
   
-  new_event_found_ = false;
+  new_music_found_ = false;
 
   /*
     Don't need to sync alignments, if we're not using extenders. 
@@ -313,10 +308,10 @@ Figured_bass_engraver::process_music ()
     }
 
   vsize k = 0;
-  for (vsize i = 0; i < new_events_.size (); i++)
+  for (vsize i = 0; i < new_musics_.size (); i++)
     {
       while (k < groups_.size ()
-            && groups_[k].current_event_)
+            && groups_[k].current_music_)
        k++;
       
       if (k >= groups_.size ())
@@ -325,7 +320,7 @@ Figured_bass_engraver::process_music ()
          groups_.push_back (group);
        }
       
-      groups_[k].current_event_ = new_events_[i];
+      groups_[k].current_music_ = new_musics_[i];
       groups_[k].figure_item_ = 0;
       k++;
     }
@@ -413,14 +408,14 @@ Figured_bass_engraver::create_grobs ()
     {
       Figure_group &group = groups_[i];
       
-      if (group.current_event_)
+      if (group.current_music_)
        {
          Item *item
            = make_item ("BassFigure",
-                        group.current_event_->self_scm ());
+                        group.current_music_->self_scm ());
 
          
-         SCM fig = group.current_event_->get_property ("figure");
+         SCM fig = group.current_music_->get_property ("figure");
          if (!group.group_)
            {
              group.group_ = make_spanner ("BassFigureLine", SCM_EOL);
@@ -436,13 +431,13 @@ Figured_bass_engraver::create_grobs ()
            }
          
          group.number_ = fig;
-         group.alteration_ = group.current_event_->get_property ("alteration");
+         group.alteration_ = group.current_music_->get_property ("alteration");
 
-         SCM text = group.current_event_->get_property ("text");
+         SCM text = group.current_music_->get_property ("text");
          if (!Text_interface::is_markup (text)
              && ly_is_procedure (proc))
            {
-             text = scm_call_3 (proc, fig, group.current_event_->self_scm (),
+             text = scm_call_3 (proc, fig, group.current_music_->self_scm (),
                                 context ()->self_scm ());
            }
 
@@ -480,8 +475,7 @@ ADD_TRANSLATOR (Figured_bass_engraver,
                "BassFigureLine "
                ,
                /* accept */
-               "bass-figure-event "
-               "rest-event",
+               "bass-figure-event rest-event",
 
                /* read */
                "figuredBassAlterationDirection "
@@ -489,7 +483,6 @@ ADD_TRANSLATOR (Figured_bass_engraver,
                "figuredBassFormatter "
                "implicitBassFigures "
                "useBassFigureExtenders "
-               "ignoreFiguredBassRest "
                ,
 
                /* write */