]> git.donarmstrong.com Git - lilypond.git/blob - lily/beaming-info.cc
lilypond-1.3.131
[lilypond.git] / lily / beaming-info.cc
1 /*   
2      beaming-info.cc --  implement Beaming_info, Beaming_info_list
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "beaming.hh"
11
12 Beaming_info::Beaming_info( )
13 {
14   start_mom_ = 0;
15   beams_i_drul_[LEFT] = 0;
16   beams_i_drul_[RIGHT] = 0;  
17 }
18
19 Beaming_info::Beaming_info(Moment m, int i)
20 {
21   start_mom_ = m;
22   beams_i_drul_[LEFT] = i;
23   beams_i_drul_[RIGHT] = i;  
24 }
25
26 const int infinity_i = INT_MAX; // guh.
27
28 int
29 Beaming_info_list::min_denominator_index () const
30 {
31   int minden = infinity_i;
32   int minidx = -1;
33
34   for (int i=1; i < infos_.size ( ); i++)
35     {
36       if (infos_[i].start_mom_.den_i () < minden)
37         {
38           minidx = i;
39           minden = infos_[i].start_mom_.den_i  ();
40         }
41     }
42
43   return minidx;
44 }
45
46 int
47 Beaming_info_list::beam_extend_count (Direction d) const
48 {
49   if (infos_.size () == 1)
50     return infos_[0].beams_i_drul_[d];
51
52   Beaming_info thisbeam  = infos_.boundary (d, 0);
53   Beaming_info next  = infos_.boundary (d, 1);
54   
55   return thisbeam.beams_i_drul_[-d] <? next.beams_i_drul_[d];
56 }
57
58 void
59 Beaming_info_list::beamify ()
60 {
61   if (infos_.size () <= 1)
62     return;
63       
64   Drul_array<Beaming_info_list> splits;
65   int m = min_denominator_index ();
66   splits[LEFT].infos_ = infos_.slice (0,m);
67   splits[RIGHT].infos_ = infos_.slice (m, infos_.size ());
68
69   Direction d = LEFT;
70  
71   do
72     {
73       splits[d].beamify ();
74     }
75   while (flip (&d) != LEFT);
76
77   int middle_beams = splits[RIGHT].beam_extend_count (LEFT) <?
78     splits[LEFT].beam_extend_count (RIGHT);
79
80   do
81     {
82       if (splits[d].infos_.size () != 1)
83         {
84           splits[d].infos_.boundary (-d, 0).beams_i_drul_[-d] = middle_beams;
85         }
86     }
87   while (flip (&d) != LEFT);
88
89   infos_ = splits[LEFT].infos_;
90   infos_.concat (splits[RIGHT].infos_);
91 }
92
93 void
94 Beaming_info_list::add_stem (Moment m, int b)
95 {
96   infos_.push  (Beaming_info (m, b));
97 }