2 spanner.cc -- implement Spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
14 IMPLEMENT_STATIC_NAME(Spanner);
15 IMPLEMENT_IS_TYPE_B1(Spanner,Score_elem);
18 Spanner::do_print()const
21 mtor << "Between col " <<
22 left_col_l_->rank_i() << ", " << right_col_l_->rank_i() ;
23 if (broken_into_l_arr_.size())
24 mtor << "with broken pieces\n";
29 Spanner::break_into_pieces()
31 PCol * left = left_col_l_;
32 PCol * right = right_col_l_;
33 if(left->daddy_l_) left = left->daddy_l_;
34 if(right->daddy_l_) right = right->daddy_l_;
37 Link_array<PCol> break_cols = pscore_l_->broken_col_range(left,right);
38 Link_array<Spanner> broken_into_l_arr;
40 break_cols.insert(left,0);
41 break_cols.push(right);
43 for (int i=1; i < break_cols.size(); i++) {
44 Spanner* span_p = clone()->spanner();
45 left = break_cols[i-1];
46 right = break_cols[i];
48 right = right->prebreak_p_;
50 left = left->postbreak_p_;
52 assert(left&&right && left->line_l_ == right->line_l_);
54 span_p->left_col_l_ = left;
55 span_p->right_col_l_ = right;
57 pscore_l_->typeset_broken_spanner(span_p);
58 broken_into_l_arr.push( span_p );
61 broken_into_l_arr_ = broken_into_l_arr;
65 Spanner::do_break_processing()
67 if (!left_col_l_->line_l_)
68 left_col_l_ = left_col_l_->postbreak_p_;
69 if (!right_col_l_->line_l_)
70 right_col_l_ = right_col_l_->prebreak_p_;
75 for (int i=0; i < broken_into_l_arr_.size(); i++)
76 broken_into_l_arr_[i]->handle_broken_dependencies();
78 handle_broken_dependencies();
85 left_col_l_ = right_col_l_ = 0;
90 Spanner::do_width()const
92 Real r = right_col_l_->hpos;
93 Real l = left_col_l_->hpos;
94 assert(*left_col_l_ < *right_col_l_);
97 return Interval(0, r-l);
101 Spanner::line_l()const
103 if ( left_col_l_->line_l_ != right_col_l_->line_l_)
105 return left_col_l_->line_l_;
110 Spanner::find_broken_piece(Line_of_score*l)const
112 for (int i=0; i < broken_into_l_arr_.size(); i++)
113 if(broken_into_l_arr_[i]->line_l() == l)
114 return broken_into_l_arr_[i];
120 Spanner::broken_b()const
122 return broken_into_l_arr_.size();