From: Han-Wen Nienhuys Date: Tue, 19 Dec 2006 23:12:52 +0000 (+0100) Subject: Limit beamlet width at abs(last_stem - stem)/2. Fixes #178. X-Git-Tag: release/2.11.4-1~13^2~14 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=fdc410ddf1a25df4a7a1cdf8af05d20f1d003a1d;p=lilypond.git Limit beamlet width at abs(last_stem - stem)/2. Fixes #178. --- diff --git a/input/regression/beam-beamlet-grace.ly b/input/regression/beam-beamlet-grace.ly new file mode 100644 index 0000000000..5c57a1ea52 --- /dev/null +++ b/input/regression/beam-beamlet-grace.ly @@ -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 +} diff --git a/lily/beam.cc b/lily/beam.cc index d020483352..77953070c9 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -385,10 +385,14 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common) Direction event_dir = LEFT; do { - Drul_array on_bound (j == 0 && event_dir==LEFT, - j == segs.size() - 1 && event_dir==RIGHT); - Drul_array 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_); @@ -400,7 +404,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] @@ -413,12 +417,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; } } diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 9126bfbfec..67daab8de8 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -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_;