2 scoreline.cc -- implement Line_of_score
4 source file of the GNU LilyPond music typesetter
6 (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "scoreline.hh"
10 #include "staffline.hh"
14 #include "paper-def.hh"
20 take out hard coded TeX stuff.
24 Line_of_score::TeX_string() const
26 String s("\\hbox{%<- line of score\n");
28 s+= "\\scorelineerrormark";
31 Real lastpos = cols[0]->hpos;
32 for (int i=0; i < cols.size(); i++){
34 // all items in the current line & staff.
36 Real delta = col_l->hpos - lastpos;
39 if (col_l->error_mark_b_) {
40 chunk_str += String("\\columnerrormark");
42 // now output the items.
43 for (iter_top(col_l->its,j); j.ok(); j++) {
44 chunk_str += j->TeX_string();
47 for (iter_top(col_l->starters,j); j.ok(); j++) {
48 if (j->name() != name())
49 chunk_str += j->TeX_string();
54 s +=String( "\\kern ") + print_dimen(delta);
56 lastpos = col_l->hpos;
64 Line_of_score::Line_of_score()
71 Line_of_score::do_substitute_dependency(Score_elem*o, Score_elem*n)
73 Spanner_elem_group::do_substitute_dependency(o,n);
76 while ((i =line_arr_.find_i((Spanner_elem_group*)o->spanner())) >=0)
78 line_arr_[i] = (Spanner_elem_group*)n->spanner();
85 Line_of_score::do_post_processing()
88 for (int i=line_arr_.size(); i--; ) {
89 Interval y = line_arr_[i]->height() ;
92 line_arr_[i]->translate(Offset(0, -y[-1] + y_pos));
95 translate(Offset(0, -y_pos));
98 IMPLEMENT_STATIC_NAME(Line_of_score);
101 Line_of_score::add_line(Spanner_elem_group*e)
108 Line_of_score::contains_b(PCol const* c)const
110 return cols.find_l((PCol*)c);
114 Line_of_score::do_pre_processing()
116 left_col_l_ = pscore_l_->cols.top();
117 right_col_l_ = pscore_l_->cols.bottom();
118 for (int i=0; i < line_arr_.size(); i++){
119 line_arr_[i]->left_col_l_ = left_col_l_;
120 line_arr_[i]->right_col_l_ = right_col_l_;
125 Line_of_score::set_breaking(Array<Col_hpositions> const &breaking)
127 for (int j=0; j < breaking.size(); j++) {
128 const Array<PCol*> &curline(breaking[j].cols);
129 const Array<PCol*> &errors(breaking[j].error_col_l_arr_);
130 const Array<Real> &config(breaking[j].config);
132 for (int i=0; i < errors.size(); i++)
133 errors[i]->error_mark_b_ = true;
135 Line_of_score *line_p = (Line_of_score*)clone();
136 for (int i=0; i < curline.size(); i++){
137 curline[i]->hpos = config[i];
138 curline[i]->line_l_ = (Line_of_score*)line_p;
140 ((Array<PCol*> &)line_p->cols) = curline;
141 line_p->left_col_l_ = curline[0];
142 line_p->right_col_l_= curline.top();
143 pscore_l_->typeset_broken_spanner(line_p);
144 broken_into_l_arr_.push(line_p);
149 Line_of_score::break_into_pieces()
154 Link_array<Line_of_score>
155 Line_of_score::get_lines()const
157 Link_array<Line_of_score> ret;
158 assert(broken_into_l_arr_.size());
159 for (int i=0; i < broken_into_l_arr_.size(); i++) {
160 ret.push((Line_of_score*)broken_into_l_arr_[i]);