]> git.donarmstrong.com Git - lilypond.git/blob - lily/scoreline.cc
release: 0.1.1
[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_f_;
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_f_ - 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_f_;
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
73 IMPLEMENT_IS_TYPE_B1(Line_of_score,Spanner);
74
75 void
76 Line_of_score::add(Score_elem*e)
77 {
78     if( !e->dependent_size())   // avoid excess dependencies.
79         add_dependency(e);
80 }
81
82 bool
83 Line_of_score::contains_b(PCol const* c)const
84 {
85     return cols.find_l((PCol*)c);
86 }
87
88 void
89 Line_of_score::set_breaking(Array<Col_hpositions> const &breaking)
90 {
91     for (int j=0; j < breaking.size(); j++) {
92         const Array<PCol*> &curline(breaking[j].cols);
93         const Array<PCol*> &errors(breaking[j].error_col_l_arr_);
94         const Array<Real> &config(breaking[j].config);
95         
96         for (int i=0; i < errors.size(); i++)
97             errors[i]->error_mark_b_ = true;
98
99         Line_of_score *line_l=0;
100         Line_of_score *line_p =0;
101         
102         if (breaking.size() >1) {
103             line_p = (Line_of_score*)clone()->spanner();
104             line_p->copy_dependencies( *this );
105             line_l = line_p;
106         } else 
107             line_l =  this;
108         
109         ((Array<PCol*> &)line_l->cols) = curline;
110         line_l->left_col_l_ =  curline[0];
111         line_l->right_col_l_= curline.top();
112         
113         if (line_p) {  
114             pscore_l_->typeset_broken_spanner(line_p);
115             broken_into_l_arr_.push(line_p);
116         }
117         
118         for (int i=0; i < curline.size(); i++){
119             curline[i]->hpos_f_ = config[i];
120             curline[i]->line_l_ = (Line_of_score*)line_l;
121         }
122     }
123 }
124
125 void
126 Line_of_score::break_into_pieces(bool)
127 {
128 }
129
130 Link_array<Line_of_score>
131 Line_of_score::get_lines()const
132 {
133     Link_array<Line_of_score> ret;
134
135     if (broken_into_l_arr_.size())
136         for (int i=0; i < broken_into_l_arr_.size(); i++) {
137             ret.push((Line_of_score*)broken_into_l_arr_[i]);
138         }
139     else 
140         ret.push((Line_of_score*)this); // ugh
141     
142     return ret;
143 }
144
145 void
146 Line_of_score::do_print()const
147 {
148     Spanner::do_print();
149 }
150
151 Interval
152 Line_of_score::do_width()const
153
154     return Spanner::do_width();
155 }