]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/auto-beam-engraver.cc
patch::: 1.3.151.jcn1
[lilypond.git] / lily / auto-beam-engraver.cc
index 07ff86dceb4649d770cfd8b2c16ec7aa1866bf59..b3353789cd1faa855872f799c5ec9e7b139a6bd8 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1999--2000 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2001 Jan Nieuwenhuizen <janneke@gnu.org>
   
  */
 
@@ -117,8 +117,8 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
   else
     function = gh_list (ly_symbol2scm ("end"), SCM_UNDEFINED);
 
-  Moment one_beat = *unsmob_momentget_property ("beatLength"));
-  int num = *unsmob_moment (get_property("measureLength")) / one_beat;
+  Moment one_beat = *unsmob_moment (get_property ("beatLength"));
+  int num = *unsmob_moment (get_property ("measureLength")) / one_beat;
   int den = one_beat.den_i ();
   SCM time = gh_list (gh_int2scm (num), gh_int2scm (den), SCM_UNDEFINED);
 
@@ -130,7 +130,7 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
   /* first guess */
   
   /* begin beam at any position
  (and fallback for end) */
+ (and fallback for end) */
   Moment moment (0);
   
   /* end beam at end of beat */
@@ -165,7 +165,19 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
   
   Rational r;
   if (moment)
-    r = unsmob_moment (get_property ("measurePosition"))->mod_rat (moment);
+    {
+      /* Ugh? measurePosition can be negative, when \partial
+        We may have to fix this elsewhere (timing translator)
+       r = unsmob_moment (get_property ("measurePosition"))->mod_rat (moment);
+      */
+      Moment pos = * unsmob_moment (get_property ("measurePosition"));
+      if (pos < Moment (0))
+       {
+         Moment length = * unsmob_moment (get_property ("measureLength"));
+         pos = length - pos;
+       }
+      r = pos.mod_rat (moment);
+    }
   else
     {
       if (dir == START)
@@ -206,9 +218,12 @@ Auto_beam_engraver::consider_end (Moment test_mom)
 Spanner*
 Auto_beam_engraver::create_beam_p ()
 {
+  if (to_boolean (get_property ("skipTypesetting")))
+    {
+     return 0;
+    }
+  
   Spanner* beam_p = new Spanner (get_property ("Beam"));
-  Beam::set_interface (beam_p);
-
   for (int i = 0; i < stem_l_arr_p_->size (); i++)
     {
       /*
@@ -219,7 +234,7 @@ Auto_beam_engraver::create_beam_p ()
          scm_unprotect_object (beam_p->self_scm ());
          return 0;
        }
-      Beam::add_stem (beam_p,(*stem_l_arr_p_)[i]);
+      Beam::add_stem (beam_p, (*stem_l_arr_p_)[i]);
     }
   
   announce_grob (beam_p, 0);
@@ -248,6 +263,7 @@ Auto_beam_engraver::junk_beam ()
   stem_l_arr_p_ = 0;
   delete grouping_p_;
   grouping_p_ = 0;
+
   shortest_mom_ = Moment (1, 8);
 }
 
@@ -259,6 +275,7 @@ Auto_beam_engraver::end_beam ()
       junk_beam ();
     }
   else
+    
     {
       finished_beam_p_ = create_beam_p ();
       if (finished_beam_p_)
@@ -266,8 +283,9 @@ Auto_beam_engraver::end_beam ()
       delete stem_l_arr_p_;
       stem_l_arr_p_ = 0;
       grouping_p_ = 0;
-      shortest_mom_ = Moment (1, 8);
     }
+
+  shortest_mom_ = Moment (1, 8);
 }
 
 void
@@ -440,7 +458,7 @@ Auto_beam_engraver::create_grobs ()
        {
          Moment now = now_mom ();
          if ((extend_mom_ < now)
-             || ((extend_mom_ == now) && (last_add_mom_ != now )))
+             || ((extend_mom_ == now) && (last_add_mom_ != now)))
            {
              end_beam ();
            }