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++)
56 Spanner* span_p = clone()->spanner ();
58 span_p->copy_dependencies (*this);
59 left = break_cols[i-1];
60 right = break_cols[i];
62 right = right->prebreak_p_;
64 left = left->postbreak_p_;
66 assert (left&&right && left->line_l_ == right->line_l_);
68 span_p->left_col_l_ = left;
69 span_p->right_col_l_ = right;
71 pscore_l_->typeset_broken_spanner (span_p);
72 broken_into_l_arr.push (span_p);
75 broken_into_l_arr_ = broken_into_l_arr;
79 Spanner::set_my_columns()
81 if (!left_col_l_->line_l_)
82 left_col_l_ = left_col_l_->postbreak_p_;
83 if (!right_col_l_->line_l_)
84 right_col_l_ = right_col_l_->prebreak_p_;
88 Spanner::do_break_processing()
94 break_into_pieces (true);
95 for (int i=0; i < broken_into_l_arr_.size(); i++)
96 broken_into_l_arr_[i]->handle_broken_dependencies();
100 handle_broken_dependencies();
107 left_col_l_ = right_col_l_ = 0;
112 Spanner::do_width()const
114 Real r = right_col_l_->hpos_f_;
115 Real l = left_col_l_->hpos_f_;
116 assert (*left_col_l_ < *right_col_l_);
119 return Interval (0, r-l);
123 Spanner::line_l()const
125 if ( left_col_l_->line_l_ != right_col_l_->line_l_)
127 return left_col_l_->line_l_;
132 Spanner::find_broken_piece (Line_of_score*l)const
134 for (int i=0; i < broken_into_l_arr_.size(); i++)
135 if (broken_into_l_arr_[i]->line_l() == l)
136 return broken_into_l_arr_[i];
142 Spanner::broken_b()const
144 return broken_into_l_arr_.size();