]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beaming-info.cc
* lily/beam.cc (set_beaming): don't clip edges.
[lilypond.git] / lily / beaming-info.cc
index c9751f049bec5704c130836c317aaa7dafac57a1..63f845489b09b96866dc961f66a22edc19050c47 100644 (file)
@@ -1,11 +1,10 @@
-/*   
-     beaming-info.cc --  implement Beaming_info, Beaming_info_list
-  
+/*
+  beaming-info.cc -- implement Beaming_info, Beaming_info_list
+
   source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
+
+  (c) 1999--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
 
 #include "beaming.hh"
 
@@ -13,32 +12,31 @@ Beaming_info::Beaming_info ()
 {
   start_mom_ = 0;
   beams_i_drul_[LEFT] = 0;
-  beams_i_drul_[RIGHT] = 0;  
+  beams_i_drul_[RIGHT] = 0;
 }
 
 Beaming_info::Beaming_info (Moment m, int i)
 {
   start_mom_ = m;
   beams_i_drul_[LEFT] = i;
-  beams_i_drul_[RIGHT] = i;  
+  beams_i_drul_[RIGHT] = i;
 }
 
-const int infinity_i = INT_MAX;        // guh.
-const int at_beat = 1<<15;
+const int at_beat = 1 << 15;
 
 int
-Beaming_info_list::best_splitpoint_index (Moment &beat_length,bool subdivide) const
+Beaming_info_list::best_splitpoint_index (Moment &beat_length, bool subdivide) const
 {
-  int minden = infinity_i;
+  int minden = INT_MAX;
   int minidx = -1;
   Moment beat_pos;
 
-  for (int i=1; i < infos_.size (); i++)
+  for (int i = 1; i < infos_.size (); i++)
     {
       beat_pos = infos_[i].start_mom_ / beat_length;
       int den = beat_pos.den ();
-      if (infos_[i].beams_i_drul_[LEFT] == infos_[i-1].beams_i_drul_[RIGHT] && !subdivide)
-       den *= 4;
+      if (infos_[i].beams_i_drul_[LEFT] == infos_[i - 1].beams_i_drul_[RIGHT] && !subdivide)
+       den *= 2;
       if (den < minden)
        {
          minidx = i;
@@ -46,7 +44,7 @@ Beaming_info_list::best_splitpoint_index (Moment &beat_length,bool subdivide) co
        }
     }
 
-  return minidx|(minden==1 && subdivide ? at_beat : 0);
+  return minidx | (minden == 1 && subdivide ? at_beat : 0);
 }
 
 int
@@ -55,47 +53,46 @@ Beaming_info_list::beam_extend_count (Direction d) const
   if (infos_.size () == 1)
     return infos_[0].beams_i_drul_[d];
 
-  Beaming_info thisbeam  = infos_.boundary (d, 0);
-  Beaming_info next  = infos_.boundary (d, 1);
-  
-  return thisbeam.beams_i_drul_[-d] <? next.beams_i_drul_[d];
+  Beaming_info thisbeam = infos_.boundary (d, 0);
+  Beaming_info next = infos_.boundary (d, 1);
+
+  return min (thisbeam.beams_i_drul_[-d], next.beams_i_drul_[d]);
 }
 
 void
-Beaming_info_list::beamify (Moment &beat_length,bool subdivide)
+Beaming_info_list::beamify (Moment &beat_length, bool subdivide)
 {
   if (infos_.size () <= 1)
     return;
-      
+
   Drul_array<Beaming_info_list> splits;
-  int m = best_splitpoint_index (beat_length,subdivide);
-  bool split = subdivide && (m & at_beat);  m = m & ~at_beat;
-  splits[LEFT].infos_ = infos_.slice (0,m);
+  int m = best_splitpoint_index (beat_length, subdivide);
+  bool split = subdivide && (m & at_beat); m = m & ~at_beat;
+  splits[LEFT].infos_ = infos_.slice (0, m);
   splits[RIGHT].infos_ = infos_.slice (m, infos_.size ());
 
   Direction d = LEFT;
+
   do
-    {
-      splits[d].beamify (beat_length,subdivide);
-    }
-  while (flip (&d) != LEFT);
+    splits[d].beamify (beat_length, subdivide);
+  while (flip (&d) != LEFT)
+    ;
 
-  int middle_beams = (split ? 1 :
-                     splits[RIGHT].beam_extend_count (LEFT) <?
-                     splits[LEFT].beam_extend_count (RIGHT));
+  int middle_beams = (split ? 1
+                     : min (splits[RIGHT].beam_extend_count (LEFT),
+                            splits[LEFT].beam_extend_count (RIGHT)));
 
   do
     {
       if (splits[d].infos_.size () != 1)
-       {
-         splits[d].infos_.boundary (-d, 0).beams_i_drul_[-d] = middle_beams;
-       }
+       splits[d].infos_.boundary (-d, 0).beams_i_drul_[-d] = middle_beams;
     }
   while (flip (&d) != LEFT);
 
   infos_ = splits[LEFT].infos_;
   infos_.concat (splits[RIGHT].infos_);
+
+  clip_edges ();
 }
 
 void
@@ -103,3 +100,13 @@ Beaming_info_list::add_stem (Moment m, int b)
 {
   infos_.push (Beaming_info (m, b));
 }
+
+void
+Beaming_info_list::clip_edges ()
+{
+  if (infos_.size ())
+    {
+      infos_[0].beams_i_drul_[LEFT] = 0;
+      infos_.top().beams_i_drul_[RIGHT] = 0;
+    }
+}