2 staff-column.cc -- implement Staff_column
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
12 #include "time-description.hh"
13 #include "score-column.hh"
14 #include "staff-column.hh"
15 #include "command-request.hh"
16 #include "musical-request.hh"
17 #include "interval.hh"
21 #include "voice-element.hh"
25 Staff_column::OK() const
28 assert (command_column_l_->when() == musical_column_l_->when());
33 Staff_column::when() const
35 return (command_column_l_)?
36 command_column_l_->when():
37 musical_column_l_->when();
41 Staff_column::add(Voice_element*ve,
42 PQueue<Subtle_req *, Moment> &subtle_req_pq )
44 for (iter_top(ve->reqs,j); j.ok(); j++) {
46 Command_req * c_l = j->command();
48 timing_req_l_arr_.push(j->command()->timing());
50 if (c_l->groupchange())
51 creationreq_l_arr_.push(c_l);
52 else if (!c_l->barcheck() && !c_l->partial() &&
53 !c_l->measuregrouping())
54 setup_one_request(j); // no need to bother children
57 musical_column_l_->add_duration(j->rhythmic()->duration());
60 Musical_req*m = j->musical();
63 Subtle_req * s = m->subtle() ;
64 if (s&& s->subtime_) {
65 subtle_req_pq.enter(s, s->subtime_ + when());
74 Staff_column::Staff_column()
76 musical_column_l_ = 0;
77 command_column_l_ = 0;
84 Staff_column::~Staff_column()
89 Staff_column::set_cols(Score_column*c1, Score_column*c2)
91 command_column_l_ = c1;
92 musical_column_l_ = c2;
96 Staff_column::setup_one_request(Request * j)
98 if (j->command()) // ugh
99 commandreq_l_arr_.push(j);
100 else if (j->musical())
101 musicalreq_l_arr_.push(j);
105 Staff_column::typeset_musical_item(Item*i)
108 Score_column * scorecolumn_l = musical_column_l_;
109 musical_column_l_->pcol_l_->pscore_l_->typeset_item(i, scorecolumn_l->pcol_l_,
110 staff_l_->pstaff_l_);
114 align items in #item_l_arr#,
116 @return the width of the items after aligning.
119 align_items(Array<Item*> item_l_arr)
122 for (int i =0; i < item_l_arr.size(); i++) {
123 Interval item_width= item_l_arr[i]->width();
124 Real dx =wid.right - item_width.left;
126 item_l_arr[i]->translate(Offset(dx ,0));
127 wid.unite(item_width);
133 translate_items(Real x, Array<Item*> item_l_arr)
135 for (int i =0; i < item_l_arr.size(); i++)
136 item_l_arr[i]->translate(Offset(x, 0));
143 Staff_column::typeset_breakable_items(Array<Item *> &pre_p_arr,
144 Array<Item *> &nobreak_p_arr,
145 Array<Item *> &post_p_arr)
147 PCol * c= command_column_l_->pcol_l_;
148 PScore *ps_l=command_column_l_->pcol_l_->pscore_l_;
150 if (!c->breakable_b()) {
151 for (int i =0; i < pre_p_arr.size(); i++)
153 pre_p_arr.set_size(0);
154 for (int i =0; i < post_p_arr.size(); i++)
155 delete post_p_arr[i];
156 post_p_arr.set_size(0);
160 for (int i =0; i < pre_p_arr.size(); i++) {
161 ps_l->typeset_item(pre_p_arr[i], c, staff_l_->pstaff_l_,0);
163 for (int i =0; i < nobreak_p_arr.size(); i++) {
164 ps_l->typeset_item(nobreak_p_arr[i], c, staff_l_->pstaff_l_,1);
166 for (int i =0; i < post_p_arr.size(); i++) {
167 ps_l->typeset_item(post_p_arr[i], c, staff_l_->pstaff_l_,2);
170 Interval pre_wid= align_items(pre_p_arr);
171 translate_items( -pre_wid.right, pre_p_arr);
172 align_items(nobreak_p_arr);
173 Interval post_wid =align_items(post_p_arr);
174 translate_items (-post_wid.left , post_p_arr);
176 pre_p_arr.set_size(0);
177 post_p_arr.set_size(0);
178 nobreak_p_arr.set_size(0);