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>
8 #include "super-elem.hh"
9 #include "scoreline.hh"
11 #include "score-elem.hh"
12 #include "bar.hh" // needed for Bar::static_name
13 #include "staffline.hh"
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 command_column_l_ = new Score_column(w);
44 musical_column_l_ = new Score_column(w);
46 command_column_l_->musical_b_ = false;
47 musical_column_l_->musical_b_ = true;
49 score_l_->pscore_p_->add(command_column_l_);
50 score_l_->pscore_p_->add(musical_column_l_);
51 disallow_break_b_ = false;
52 post_move_processing();
56 Score_engraver::finish()
59 do_removal_processing();
63 Score_engraver::do_creation_processing()
65 scoreline_l_->left_col_l_ = get_staff_info().command_pcol_l();
66 scoreline_l_->left_col_l_ ->set_breakable();
67 Engraver_group_engraver::do_creation_processing();
71 Score_engraver::do_removal_processing()
73 Engraver_group_engraver::do_removal_processing();
74 scoreline_l_->right_col_l_ = get_staff_info().command_pcol_l();
75 scoreline_l_->right_col_l_ ->set_breakable();
80 Score_engraver::process()
84 pre_move_processing();
89 Score_engraver::announce_element(Score_elem_info info)
91 announce_info_arr_.push(info);
92 info.origin_grav_l_arr_.push(this);
96 Score_engraver::do_announces()
98 /* All elements are propagated to the top upon announcement. If
99 something was created during one run of
100 Engraver_group_engraver::do_announces, then
101 announce_info_arr_.size() will be nonzero again
104 while (announce_info_arr_.size()) {
105 for (int i=0; i <announce_info_arr_.size(); i++)
111 if (announce_info_arr_[i].req_l_) {
112 Musical_req *m = announce_info_arr_[i].req_l_->musical();
113 if (m && m->rhythmic()) {
114 musical_column_l_->add_duration( m->duration());
117 Engraver_group_engraver::do_announces();
123 Score_engraver::typeset_element(Score_elem *elem_p)
125 musical_item_p_arr_.push(elem_p);
129 Score_engraver::typeset_breakable_item(Item * nobreak_p)
132 nobreak_item_p_arr_.push(nobreak_p);
137 Score_engraver::typeset_all()
139 PCol * c= get_staff_info().command_pcol_l();
140 PScore *ps_l = score_l_->pscore_p_;
142 for (int i =0; i < nobreak_item_p_arr_.size(); i++) {
143 ps_l->typeset_item(nobreak_item_p_arr_[i], c, 0);
144 scoreline_l_->add_dependency(nobreak_item_p_arr_[i]);
146 nobreak_item_p_arr_.set_size(0);
148 for (int i=0; i < musical_item_p_arr_.size(); i++) {
149 PCol* m = get_staff_info().musical_pcol_l();
150 Score_elem *elem_p = musical_item_p_arr_[i];
152 scoreline_l_->add(elem_p);
153 if (elem_p->spanner()) {
154 ps_l->typeset_unbroken_spanner(elem_p->spanner());
155 } else if (elem_p->item()) {
156 ps_l->typeset_item(elem_p->item(), m, 0);
160 musical_item_p_arr_.set_size(0);
165 Score_engraver::do_pre_move_processing()
167 if ( !disallow_break_b_ ){
168 get_staff_info().command_pcol_l()->set_breakable();
170 if ( ! (breaks_i_%8))
171 *mlog << "[" << breaks_i_ << "]" << flush;
173 // this generates all items.
174 Engraver_group_engraver::do_pre_move_processing();
181 Score_engraver::get_staff_info()const
185 inf.command_l_ = command_column_l_;
186 inf.musical_l_ = musical_column_l_;
191 Score_engraver::paper()const
193 return score_l_->paper_p_;
199 Score_engraver::do_try_request(Request*r)
202 for ( int i =0; !gotcha && i < nongroup_l_arr_.size() ; i++)
203 gotcha = nongroup_l_arr_[i]->try_request(r);
205 if ( r->command() && r->command()->disallowbreak())
206 disallow_break_b_ = true;
210 IMPLEMENT_IS_TYPE_B1(Score_engraver,Engraver_group_engraver);
211 IMPLEMENT_STATIC_NAME(Score_engraver);
212 ADD_THIS_ENGRAVER(Score_engraver);