]> git.donarmstrong.com Git - lilypond.git/commitdiff
Limit beamlet width at abs(last_stem - stem)/2. Fixes #178.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 19 Dec 2006 23:12:52 +0000 (00:12 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 19 Dec 2006 23:13:22 +0000 (00:13 +0100)
input/regression/beam-beamlet-grace.ly [new file with mode: 0644]
lily/beam.cc
lily/include/beam.hh

diff --git a/input/regression/beam-beamlet-grace.ly b/input/regression/beam-beamlet-grace.ly
new file mode 100644 (file)
index 0000000..5c57a1e
--- /dev/null
@@ -0,0 +1,14 @@
+\header
+{
+  texidoc = "Beamlets in grace notes remain readable."
+}
+
+\version "2.10.2"
+\layout {
+  ragged-right = ##t
+}
+
+\relative c'
+\context Staff {
+  f1 \grace { a'8[ f16] } g1
+}
index dcbed75ce551b560df303f70dbd7118c014a23ed..224ba1a3f4b1cabb2f82df80aeb7352efde191ca 100644 (file)
@@ -381,10 +381,14 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
          Direction event_dir = LEFT;
          do
            {
-             Drul_array<bool> on_bound (j == 0 && event_dir==LEFT,
-                                        j == segs.size() - 1 && event_dir==RIGHT);
-             Drul_array<bool> inside (j > 0, j < segs.size()-1);
-             bool event = on_bound[event_dir]
+             bool on_bound = (event_dir == LEFT) ? j == 0 :
+               j == segs.size() - 1;
+
+             bool inside_stem = (event_dir == LEFT)
+                       ? segs[j].stem_index_ > 0
+                       : segs[j].stem_index_ < stems.size () - 1;
+                     
+             bool event = on_bound
                || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
                || (abs (vertical_count) >= segs[j].max_connect_
                    || abs (vertical_count) >= segs[j + event_dir].max_connect_);
@@ -396,7 +400,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
              current.horizontal_[event_dir] = segs[j].stem_x_;
              if (segs[j].dir_ == event_dir)
                {
-                 if (on_bound[event_dir]
+                 if (on_bound
                      && me->get_bound (event_dir)->break_status_dir ())
                    {
                      current.horizontal_[event_dir]
@@ -409,12 +413,16 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
                        Stem::duration_log (segs[j].stem_) == 1
                        ? 1.98
                        : 1.32; // URG.
-                     
-                     if (inside[event_dir])
-                       notehead_width = min (notehead_width,
-                                             fabs (segs[j+ event_dir].stem_x_
-                                                   - segs[j].stem_x_)/2);
-                     
+
+
+                     if (inside_stem)
+                       {
+                         Grob *neighbor_stem = stems[segs[j].stem_index_ + event_dir];
+                         Real neighbor_stem_x = neighbor_stem->relative_coordinate (commonx, X_AXIS);
+
+                         notehead_width = min (notehead_width,
+                                               fabs (neighbor_stem_x - segs[j].stem_x_)/2);
+                       }
                      current.horizontal_[event_dir] += event_dir * notehead_width;
                    }
                }
index 71821f6629f796679c0d84fa53be0bf87c0464a5..069b3530813c61680146e5a557c8e1d63ea584e1 100644 (file)
@@ -55,7 +55,7 @@ struct Beam_stem_segment
   Real width_;
   Real stem_x_;
   int rank_;
-  int stem_index_;
+  vsize stem_index_;
   bool gapped_;
   Direction dir_;
   int max_connect_;