]> git.donarmstrong.com Git - lilypond.git/blob - lily/scoreline.cc
release: 0.0.73pre
[lilypond.git] / lily / scoreline.cc
1 /*
2   scoreline.cc -- implement Line_of_score
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "scoreline.hh"
10 #include "staffline.hh"
11 #include "dimen.hh"
12 #include "spanner.hh"
13 #include "symbol.hh"
14 #include "paper-def.hh"
15 #include "p-col.hh"
16 #include "p-score.hh"
17
18
19 /* To do:
20    take out hard coded TeX stuff.
21    
22    */
23 String
24 Line_of_score::TeX_string() const
25 {
26      String s("\\hbox{%<- line of score\n");
27      if (error_mark_b_)
28          s+= "\\scorelineerrormark";
29      
30      
31      Real lastpos = cols[0]->hpos;
32      for (int i=0; i < cols.size();  i++){
33          PCol* col_l= cols[i];
34          // all items in the current line & staff.
35          String chunk_str;
36          Real delta  = col_l->hpos - lastpos;
37             
38             
39          if (col_l->error_mark_b_) {
40              chunk_str += String("\\columnerrormark");
41          }
42          // now output the items.
43          for (iter_top(col_l->its,j); j.ok(); j++) {
44              chunk_str += j->TeX_string();
45          }
46          // spanners.
47          for (iter_top(col_l->starters,j); j.ok(); j++) {
48              if (j->name() != name())
49                  chunk_str += j->TeX_string();
50          }
51          if (chunk_str!="") {
52              // moveover
53              if (delta)
54                  s +=String( "\\kern ") + print_dimen(delta);
55              s += chunk_str;
56              lastpos = col_l->hpos;
57          }
58      }
59      s += "}";
60      return s;
61 }
62
63
64 Line_of_score::Line_of_score()
65 {
66     error_mark_b_ = 0;
67 }
68
69
70
71
72 IMPLEMENT_STATIC_NAME(Line_of_score);
73 IMPLEMENT_IS_TYPE_B1(Line_of_score,Spanner);
74
75 void
76 Line_of_score::add(Score_elem*e)
77 {
78     add_dependency(e);
79 }
80
81 bool
82 Line_of_score::contains_b(PCol const* c)const
83 {
84     return cols.find_l((PCol*)c);
85 }
86
87 void
88 Line_of_score::set_breaking(Array<Col_hpositions> const &breaking)
89 {
90     for (int j=0; j < breaking.size(); j++) {
91         const Array<PCol*> &curline(breaking[j].cols);
92         const Array<PCol*> &errors(breaking[j].error_col_l_arr_);
93         const Array<Real> &config(breaking[j].config);
94         
95         for (int i=0; i < errors.size(); i++)
96             errors[i]->error_mark_b_ = true;
97
98         Line_of_score *line_l=0;
99         Line_of_score *line_p =0;
100         
101         if (breaking.size() >1) {
102             line_p = (Line_of_score*)clone()->spanner();
103             line_l = line_p;
104         } else 
105             line_l =  this;
106         
107         ((Array<PCol*> &)line_l->cols) = curline;
108         line_l->left_col_l_ =  curline[0];
109         line_l->right_col_l_= curline.top();
110         
111         if (line_p) {  
112             pscore_l_->typeset_broken_spanner(line_p);
113             broken_into_l_arr_.push(line_p);
114         }
115         
116         for (int i=0; i < curline.size(); i++){
117             curline[i]->hpos = config[i];
118             curline[i]->line_l_ = (Line_of_score*)line_l;
119         }
120     }
121 }
122
123 void
124 Line_of_score::break_into_pieces()
125 {
126 }
127
128 Link_array<Line_of_score>
129 Line_of_score::get_lines()const
130 {
131     Link_array<Line_of_score> ret;
132
133     if(broken_into_l_arr_.size())
134         for (int i=0; i < broken_into_l_arr_.size(); i++) {
135             ret.push((Line_of_score*)broken_into_l_arr_[i]);
136         }
137     else 
138         ret.push((Line_of_score*)this); // ugh
139     
140     return ret;
141 }
142
143 void
144 Line_of_score::do_print()const
145 {
146     Spanner::do_print();
147 }
148
149 Interval
150 Line_of_score::do_width()const
151
152     return Spanner::do_width();
153 }