]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/auto-beam-engraver.cc
Merge branch 'master' of ssh+git://hanwen@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / auto-beam-engraver.cc
index 26aef175432b2c4e05554e7f5b01980b19cb5d87..9f5e53da69fa27b3dfa465fcc17cff9ef45c8c7f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2006 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2007 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "bar-line.hh"
@@ -68,15 +68,17 @@ private:
   Moment beam_start_moment_;
   Moment beam_start_location_;
 
-  bool subdivide_beams_;
-  Moment beat_length_;
-
   // We act as if beam were created, and start a grouping anyway.
   Beaming_pattern *grouping_;
   SCM beam_settings_;
 
   Beaming_pattern *finished_grouping_;
 
+
+  Beaming_options beaming_options_;
+  Beaming_options finished_beaming_options_;
+  
+  
   void check_bar_property ();
 };
 
@@ -133,7 +135,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Auto_beam_engraver, beam_forbid);
 void
 Auto_beam_engraver::listen_beam_forbid (Stream_event *ev)
 {
-  forbid_ = ev;
+  ASSIGN_EVENT_ONCE (forbid_, ev);
 }
 
 bool
@@ -183,11 +185,10 @@ Auto_beam_engraver::create_beam ()
       return 0;
 
   /*
-    Can't use make_spanner_from_properties() because we have to use
+    Can't use make_spanner_from_properties () because we have to use
     beam_settings_.
   */
-  Spanner *beam = new Spanner (beam_settings_,
-                              context ()->get_grob_key ("Beam"));
+  Spanner *beam = new Spanner (beam_settings_);
 
   for (vsize i = 0; i < stems_->size (); i++)
     Beam::add_stem (beam, (*stems_)[i]);
@@ -208,6 +209,7 @@ Auto_beam_engraver::begin_beam ()
 
   stems_ = new vector<Item*>;
   grouping_ = new Beaming_pattern ();
+  beaming_options_.from_context (context ());
   beam_settings_ = updated_grob_properties (context (), ly_symbol2scm ("Beam"));
 
   beam_start_moment_ = now_mom ();
@@ -238,8 +240,13 @@ Auto_beam_engraver::end_beam ()
   else
     {
       finished_beam_ = create_beam ();
+      
       if (finished_beam_)
-       finished_grouping_ = grouping_;
+       {
+         announce_end_grob (finished_beam_, SCM_EOL);
+         finished_grouping_ = grouping_;
+         finished_beaming_options_ = beaming_options_;
+       }
       delete stems_;
       stems_ = 0;
       grouping_ = 0;
@@ -257,7 +264,7 @@ Auto_beam_engraver::typeset_beam ()
       if (!finished_beam_->get_bound (RIGHT))
        finished_beam_->set_bound (RIGHT, finished_beam_->get_bound (LEFT));
       
-      finished_grouping_->beamify (context ());
+      finished_grouping_->beamify (finished_beaming_options_);
       Beam::set_beaming (finished_beam_, finished_grouping_);
       finished_beam_ = 0;
 
@@ -427,6 +434,11 @@ ADD_TRANSLATOR (Auto_beam_engraver,
                "@ref{Stem_engraver} properties @code{stemLeftBeamCount} and "
                "@code{stemRightBeamCount}. ",
                /* create */ "Beam",
-               /* accept */ "beam-forbid-event",
-               /* read */ "autoBeaming autoBeamSettings beatLength subdivideBeams",
+
+               /* read */
+               "autoBeaming "
+               "autoBeamSettings "
+               "beatLength "
+               "subdivideBeams ",
+               
                /* write */ "");