X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbeaming-info.cc;h=f71ce8cfb261b891b725cee6c16672fa174fdeee;hb=5700feb8f2c755876f7ff9aab46470c074d59918;hp=653e1b3382eafa57403bc3c30833a9e58ee33f60;hpb=94189ec2b8da6d7e89dc619c646a927adead9b19;p=lilypond.git diff --git a/lily/beaming-info.cc b/lily/beaming-info.cc index 653e1b3382..f71ce8cfb2 100644 --- a/lily/beaming-info.cc +++ b/lily/beaming-info.cc @@ -1,46 +1,50 @@ -/* - 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--2001 Han-Wen Nienhuys - - */ + + (c) 1999--2005 Han-Wen Nienhuys +*/ #include "beaming.hh" -Beaming_info::Beaming_info( ) +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) +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; int -Beaming_info_list::min_denominator_index () 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++) { - if (infos_[i].start_mom_.den_i () < minden) + 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 *= 2; + if (den < minden) { minidx = i; - minden = infos_[i].start_mom_.den_i (); + minden = den; } } - return minidx; + return minidx | (minden == 1 && subdivide ? at_beat : 0); } int @@ -49,40 +53,39 @@ 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] splits; - int m = min_denominator_index (); - 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 (); - } - while (flip (&d) != LEFT); + splits[d].beamify (beat_length, subdivide); + while (flip (&d) != LEFT) + ; - int middle_beams = splits[RIGHT].beam_extend_count (LEFT)