2 score-walker.cc -- implement Score_walker
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
11 #include "score-walker.hh"
13 #include "staff-walker.hh"
15 #include "score-column.hh"
17 Score_walker::Score_walker(Score *s)
18 :PCursor<Score_column *> (s->cols_)
21 for (iter_top(s->staffs_,i); i.ok(); i++) {
22 Staff_walker* w_p=i->get_walker_p();
23 w_p->score_walk_l_ =this;
24 walker_p_arr_.push(w_p);
28 s->find_col(0, false)->set_breakable();
29 s->find_col(s->last(), false)->set_breakable();
36 Score_walker::reinit()
38 disallow_break_walk_l_arr = walker_p_arr_;
39 disallow_break_count_ = disallow_break_walk_l_arr.size();
43 /** Advance the cursor, and all Staff_walkers contained in this. Reset
46 Score_walker::operator ++(int )
48 Moment last = ptr()->when();
50 PCursor<Score_column *>::operator++(0);
51 if (ok() && ptr()->when() == last)
52 PCursor<Score_column *>::operator++(0);
56 for (int i=0; i< walker_p_arr_.size(); i++) {
57 if (walker_p_arr_[i]->ok() &&
58 walker_p_arr_[i]->when() < when()) {
60 walker_p_arr_[i]->operator++(0);
65 /** Allow the command_column to be breakable for one staff. If all
66 staffs allow, then allow a break here. */
68 Score_walker::allow_break(Staff_walker*w)
70 for (int i=0; i < disallow_break_walk_l_arr.size(); i++) {
71 if (w == disallow_break_walk_l_arr[i]) {
72 disallow_break_count_ --;
73 disallow_break_walk_l_arr[i] =0;
75 if (!disallow_break_count_) {
76 PCursor<Score_column*> col_cursor = *this;
77 if (ptr()->musical_b())
79 col_cursor->set_breakable();
92 Score_walker::process()
94 for (int i=0; i < walker_p_arr_.size(); i++) {
95 Staff_walker *w = walker_p_arr_[i];
96 if ( w->ok() && w->when() == when() ) {
97 walker_p_arr_[i]->process();
100 if (when().denominator() == 1) {
101 *mlog << "." <<flush;
105 Score_walker::~Score_walker()
107 for (int i=0; i < walker_p_arr_.size(); i++)
108 delete walker_p_arr_[i];
109 assert( !score_l_->find_col(score_l_->last(), true)->used_b());