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 DOUT << "Between col ";
23 DOUT << left_col_l_->rank_i();
28 DOUT << right_col_l_->rank_i();
31 if (broken_into_l_arr_.size())
32 DOUT << "with broken pieces\n";
37 Spanner::break_into_pieces (bool copy_deps_b)
39 if ( broken_into_l_arr_.size())
42 PCol * left = left_col_l_;
43 PCol * right = right_col_l_;
44 if (left->daddy_l_) left = left->daddy_l_;
45 if (right->daddy_l_) right = right->daddy_l_;
48 Link_array<PCol> break_cols = pscore_l_->broken_col_range (left,right);
49 Link_array<Spanner> broken_into_l_arr;
51 break_cols.insert (left,0);
52 break_cols.push (right);
54 for (int i=1; i < break_cols.size(); i++) {
55 Spanner* span_p = clone()->spanner ();
57 span_p->copy_dependencies (*this);
58 left = break_cols[i-1];
59 right = break_cols[i];
61 right = right->prebreak_p_;
63 left = left->postbreak_p_;
65 assert (left&&right && left->line_l_ == right->line_l_);
67 span_p->left_col_l_ = left;
68 span_p->right_col_l_ = right;
70 pscore_l_->typeset_broken_spanner (span_p);
71 broken_into_l_arr.push (span_p);
74 broken_into_l_arr_ = broken_into_l_arr;
78 Spanner::set_my_columns()
80 if (!left_col_l_->line_l_)
81 left_col_l_ = left_col_l_->postbreak_p_;
82 if (!right_col_l_->line_l_)
83 right_col_l_ = right_col_l_->prebreak_p_;
87 Spanner::do_break_processing()
92 break_into_pieces (true);
93 for (int i=0; i < broken_into_l_arr_.size(); i++)
94 broken_into_l_arr_[i]->handle_broken_dependencies();
96 handle_broken_dependencies();
103 left_col_l_ = right_col_l_ = 0;
108 Spanner::do_width()const
110 Real r = right_col_l_->hpos_f_;
111 Real l = left_col_l_->hpos_f_;
112 assert (*left_col_l_ < *right_col_l_);
115 return Interval (0, r-l);
119 Spanner::line_l()const
121 if ( left_col_l_->line_l_ != right_col_l_->line_l_)
123 return left_col_l_->line_l_;
128 Spanner::find_broken_piece (Line_of_score*l)const
130 for (int i=0; i < broken_into_l_arr_.size(); i++)
131 if (broken_into_l_arr_[i]->line_l() == l)
132 return broken_into_l_arr_[i];
138 Spanner::broken_b()const
140 return broken_into_l_arr_.size();