2 score-grav.cc -- implement Score_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "super-elem.hh"
10 #include "scoreline.hh"
12 #include "score-elem.hh"
13 #include "bar.hh" // needed for Bar::static_name
14 #include "score-grav.hh"
18 #include "musical-request.hh"
19 #include "score-column.hh"
20 #include "command-request.hh"
24 Score_engraver::set_score (Score *s)
26 Global_translator::set_score (s);
27 scoreline_l_ = s->pscore_p_->super_elem_l_->line_of_score_l_;
30 Score_engraver::Score_engraver()
32 disallow_break_b_ = false;
41 Score_engraver::prepare (Moment w)
43 set_columns (new Score_column (w), new Score_column (w));
46 disallow_break_b_ = false;
47 post_move_processing();
51 Score_engraver::finish()
54 *mlog << "[" << breaks_i_ << "]" << flush;
61 Score_engraver::do_creation_processing()
63 scoreline_l_->left_col_l_ = get_staff_info().command_pcol_l ();
64 scoreline_l_->left_col_l_ ->set_breakable();
65 Engraver_group_engraver::do_creation_processing();
69 Score_engraver::do_removal_processing()
71 Engraver_group_engraver::do_removal_processing();
72 scoreline_l_->right_col_l_ = get_staff_info().command_pcol_l ();
73 scoreline_l_->right_col_l_ ->set_breakable();
79 Score_engraver::process()
83 pre_move_processing();
88 Score_engraver::announce_element (Score_elem_info info)
90 announce_info_arr_.push (info);
91 info.origin_grav_l_arr_.push (this);
95 Score_engraver::do_announces()
97 /* All elements are propagated to the top upon announcement. If
98 something was created during one run of
99 Engraver_group_engraver::do_announces, then
100 announce_info_arr_.size() will be nonzero again
103 while (announce_info_arr_.size())
105 for (int i=0; i <announce_info_arr_.size(); i++)
111 if (announce_info_arr_[i].req_l_)
113 Musical_req *m = announce_info_arr_[i].req_l_->musical();
114 if (m && m->rhythmic())
116 musical_column_l_->add_duration (m->duration());
119 Engraver_group_engraver::do_announces();
125 Score_engraver::typeset_element (Score_elem *elem_p)
127 if ( elem_p->item() && elem_p->item ()->breakable_b_)
129 nobreak_item_p_arr_.push (elem_p->item());
132 musical_item_p_arr_.push (elem_p);
136 Score_engraver::typeset_all()
138 PCol * c= get_staff_info().command_pcol_l ();
139 Paper_score *ps_l = score_l_->pscore_p_;
141 for (int i =0; i < nobreak_item_p_arr_.size(); i++)
143 ps_l->typeset_item (nobreak_item_p_arr_[i], c);
145 // should get rid of this.. .
146 scoreline_l_->add_dependency (nobreak_item_p_arr_[i]);
148 nobreak_item_p_arr_.clear();
150 for (int i=0; i < musical_item_p_arr_.size(); i++)
152 PCol* m = get_staff_info().musical_pcol_l ();
153 Score_elem *elem_p = musical_item_p_arr_[i];
155 scoreline_l_->add (elem_p);
156 if (elem_p->spanner())
158 ps_l->typeset_unbroken_spanner (elem_p->spanner());
160 else if (elem_p->item())
162 ps_l->typeset_item (elem_p->item(), m);
167 musical_item_p_arr_.clear();
172 Score_engraver::do_pre_move_processing()
174 if ( !disallow_break_b_)
176 get_staff_info().command_pcol_l ()->set_breakable ();
178 if ( ! (breaks_i_%8))
179 *mlog << "[" << breaks_i_ << "]" << flush;
181 // this generates all items.
182 Engraver_group_engraver::do_pre_move_processing();
188 Score_engraver::set_columns (Score_column *new_command_l,
189 Score_column *new_musical_l)
191 if ( command_column_l_ && command_column_l_->used_b())
192 score_l_->pscore_p_->add (command_column_l_);
195 delete command_column_l_ ;
196 command_column_l_ =0;
200 command_column_l_ = new_command_l;
201 command_column_l_->musical_b_ = false;
203 if ( musical_column_l_ && musical_column_l_->used_b())
204 score_l_->pscore_p_->add (musical_column_l_);
207 delete musical_column_l_;
208 musical_column_l_ = 0;
213 musical_column_l_ = new_musical_l;
214 musical_column_l_->musical_b_ = true;
220 Score_engraver::get_staff_info()const
224 inf.command_l_ = command_column_l_;
225 inf.musical_l_ = musical_column_l_;
230 Score_engraver::paper()const
232 return score_l_->paper_p_;
238 Score_engraver::do_try_request (Request*r)
240 bool gotcha = Engraver_group_engraver::do_try_request (r);
241 if ( !gotcha && r->command() && r->command ()->disallowbreak ())
242 disallow_break_b_ = true;
246 IMPLEMENT_IS_TYPE_B1(Score_engraver,Engraver_group_engraver);
247 ADD_THIS_ENGRAVER(Score_engraver);