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