]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam.cc
Merge with master
[lilypond.git] / lily / beam.cc
index ba6dc277e9c87c8c163f6e07e3c0d3e9bfac84dc..18cfae23cd2f58462b524a5387c95ad8871d7b92 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
@@ -317,7 +317,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
 {
   /* ugh, this has a side-effect that we need to ensure that
      Stem #'beaming is correct */
-  (void) me_grob->get_property ("quantized-positions");
+  (void) me_grob->get_property ("beaming");
 
   Spanner *me = dynamic_cast<Spanner*> (me_grob);
 
@@ -409,7 +409,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
 
              bool inside_stem = (event_dir == LEFT)
                        ? segs[j].stem_index_ > 0
-                       : segs[j].stem_index_ < stems.size () - 1;
+                       : segs[j].stem_index_ + 1  < stems.size () ;
                      
              bool event = on_bound
                || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
@@ -554,7 +554,7 @@ Beam::print (SCM grob)
                                    (me->layout ()->self_scm (), properties, quant_score));
 
       if (!score.is_empty ())
-       the_beam.add_at_edge (Y_AXIS, stem_dir, score, 1.0, 0);
+       the_beam.add_at_edge (Y_AXIS, stem_dir, score, 1.0);
     }
 #endif
 
@@ -695,7 +695,7 @@ Beam::consider_auto_knees (Grob *me)
            sets stem directions, a constant shift does not have an
            influence.
          */
-         head_extents += stem->relative_coordinate (common, Y_AXIS);
+         head_extents += stem->pure_relative_y_coordinate (common, 0, INT_MAX);
 
          if (to_dir (stem->get_property_data ("direction")))
            {
@@ -974,7 +974,6 @@ Beam::shift_region_to_valid (SCM grob, SCM posns)
   Real dx = lvs->relative_coordinate (commonx, X_AXIS) - x0;
 
   Drul_array<Real> pos = ly_scm2interval (posns);
-  
 
   scale_drul (&pos, Staff_symbol_referencer::staff_space (me));
 
@@ -1237,7 +1236,7 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming)
            {
              int count = beaming->beamlet_count (i, d);
              if (i > 0
-                 && i < stems.size () -1
+                 && i + 1 < stems.size ()
                  && Stem::is_invisible (stem))
                count = min (count, beaming->beamlet_count (i,-d));
 
@@ -1307,7 +1306,7 @@ Beam::last_normal_stem (Grob *me)
 
   rest -> stem -> beam -> interpolate_y_position ()
 */
-MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, rest_collision_callback, 2, 1);
+MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, rest_collision_callback, 2, 1, "");
 SCM
 Beam::rest_collision_callback (SCM smob, SCM prev_offset)
 {
@@ -1421,6 +1420,24 @@ Beam::is_knee (Grob *me)
   return knee;
 }
 
+bool
+Beam::is_cross_staff (Grob *me)
+{
+  extract_grob_set (me, "stems", stems);
+  Grob *staff_symbol = Staff_symbol_referencer::get_staff_symbol (me);
+  for (vsize i = 0; i < stems.size (); i++)
+    if (Staff_symbol_referencer::get_staff_symbol (stems[i]) != staff_symbol)
+      return true;
+  return false;
+}
+
+MAKE_SCHEME_CALLBACK (Beam, cross_staff, 1)
+SCM
+Beam::cross_staff (SCM smob)
+{
+  return scm_from_bool (is_cross_staff (unsmob_grob (smob)));
+}
+
 int
 Beam::get_direction_beam_count (Grob *me, Direction d)
 {