]> git.donarmstrong.com Git - lilypond.git/blob - lily/paper-column.cc
release: 1.3.19
[lilypond.git] / lily / paper-column.cc
1 /*
2   paper-column.cc -- implement Paper_column
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8 #include "moment.hh"
9 #include "paper-column.hh"
10 #include "paper-score.hh"
11 #include "debug.hh"
12
13 void
14 Paper_column::add_rod (Paper_column * p, Real d)
15 {
16   Direction dir =  Direction (sign (p->rank_i ()  - rank_i ()));
17   
18   if (!dir)
19     {
20       programming_error ("Must set minimum distance between differing columns.");
21       return;
22     }
23   
24   for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++)
25     {
26       Column_rod &rod = minimal_dists_arr_drul_[dir][i];
27       if (rod.other_l_ == p)
28         {
29           rod.distance_f_ = rod.distance_f_ >? d;
30           return ;
31         }
32     }
33
34   Column_rod cr;
35   cr.distance_f_ = d;
36   cr.other_l_ = p;
37
38   minimal_dists_arr_drul_[dir].push (cr);
39 }
40
41 void
42 Paper_column::add_spring (Paper_column * p, Real d, Real s)
43 {
44   Direction dir =  Direction (sign (p->rank_i ()  - rank_i ()));
45   
46   if (!dir)
47     {
48       warning (_ ("Must set spring between differing columns"));
49       return;
50     }
51   
52   for (int i=0; i < spring_arr_drul_[dir].size (); i++)
53     {
54       Column_spring &spring = spring_arr_drul_[dir][i];
55       if (spring.other_l_ == p)
56         {
57           spring.distance_f_ = spring.distance_f_ >? d;
58           return ;
59         }
60     }
61
62   Column_spring cr;
63   cr.distance_f_ = d;
64   cr.strength_f_ = s;  
65   cr.other_l_ = p;
66
67   spring_arr_drul_[dir].push (cr);
68 }
69
70 int
71 Paper_column::rank_i() const
72 {
73   return rank_i_;
74 }
75
76 void
77 Paper_column::set_rank (int i)
78 {
79   rank_i_ = i;
80 }
81
82 void
83 Paper_column::do_print() const
84 {
85 #ifndef NPRINT
86   DEBUG_OUT << "rank: " << rank_i_ << '\n';
87   Direction d = LEFT;
88   do
89     {
90       for (int i=0; i < minimal_dists_arr_drul_[d].size (); i++)
91         {
92           minimal_dists_arr_drul_[d][i].print ();
93         }
94       for (int i=0; i < spring_arr_drul_[d].size (); i++)
95         {
96           spring_arr_drul_[d][i].print ();
97         }
98       
99     }
100   while ((flip (&d))!=LEFT);
101   Item::do_print ();
102 #endif 
103 }
104
105 Line_of_score*
106 Paper_column::line_l() const
107 {
108   return line_l_;
109 }
110
111
112
113
114 Paper_column*
115 Paper_column::column_l () const
116 {
117   return (Paper_column*)(this);
118 }
119
120
121
122
123 Paper_column::Paper_column (Moment w)
124 {
125   set_elt_property ("when", (new Moment (w))->smobify_self ());
126   set_axes (X_AXIS, X_AXIS);
127
128   line_l_=0;
129   rank_i_ = -1;
130 }
131
132 Moment
133 Paper_column::when_mom () const
134 {
135   SCM m = get_elt_property ("when");
136   Moment s (0);
137   if (SMOB_IS_TYPE_B(Moment, m))
138     {
139       s = *SMOB_TO_TYPE (Moment,m);
140     }
141   return s;
142 }
143   
144 bool
145 Paper_column::musical_b () const
146 {
147   SCM m = get_elt_property ("shortest-starter");
148   Moment s (0);
149   if (SMOB_IS_TYPE_B(Moment, m))
150     {
151       s = *SMOB_TO_TYPE (Moment,m);
152     }
153   return s != Moment(0);
154 }