2 spanner.cc -- implement Spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
15 IMPLEMENT_IS_TYPE_B1(Spanner,Score_elem);
18 Spanner::do_print()const
21 mtor << "Between col ";
23 mtor << left_col_l_->rank_i();
28 mtor << right_col_l_->rank_i();
31 if (broken_into_l_arr_.size())
32 mtor << "with broken pieces\n";
37 Spanner::break_into_pieces(bool copy_deps_b)
39 PCol * left = left_col_l_;
40 PCol * right = right_col_l_;
41 if(left->daddy_l_) left = left->daddy_l_;
42 if(right->daddy_l_) right = right->daddy_l_;
45 Link_array<PCol> break_cols = pscore_l_->broken_col_range(left,right);
46 Link_array<Spanner> broken_into_l_arr;
48 break_cols.insert(left,0);
49 break_cols.push(right);
51 for (int i=1; i < break_cols.size(); i++) {
52 Spanner* span_p = clone()->spanner();
54 span_p->copy_dependencies( *this );
55 left = break_cols[i-1];
56 right = break_cols[i];
58 right = right->prebreak_p_;
60 left = left->postbreak_p_;
62 assert(left&&right && left->line_l_ == right->line_l_);
64 span_p->left_col_l_ = left;
65 span_p->right_col_l_ = right;
67 pscore_l_->typeset_broken_spanner(span_p);
68 broken_into_l_arr.push( span_p );
71 broken_into_l_arr_ = broken_into_l_arr;
75 Spanner::set_my_columns()
77 if (!left_col_l_->line_l_)
78 left_col_l_ = left_col_l_->postbreak_p_;
79 if (!right_col_l_->line_l_)
80 right_col_l_ = right_col_l_->prebreak_p_;
84 Spanner::do_break_processing()
89 break_into_pieces(true);
90 for (int i=0; i < broken_into_l_arr_.size(); i++)
91 broken_into_l_arr_[i]->handle_broken_dependencies();
93 handle_broken_dependencies();
100 left_col_l_ = right_col_l_ = 0;
105 Spanner::do_width()const
107 Real r = right_col_l_->hpos_f_;
108 Real l = left_col_l_->hpos_f_;
109 assert(*left_col_l_ < *right_col_l_);
112 return Interval(0, r-l);
116 Spanner::line_l()const
118 if ( left_col_l_->line_l_ != right_col_l_->line_l_)
120 return left_col_l_->line_l_;
125 Spanner::find_broken_piece(Line_of_score*l)const
127 for (int i=0; i < broken_into_l_arr_.size(); i++)
128 if(broken_into_l_arr_[i]->line_l() == l)
129 return broken_into_l_arr_[i];
135 Spanner::broken_b()const
137 return broken_into_l_arr_.size();