]> git.donarmstrong.com Git - lilypond.git/blob - lily/spanner.cc
release: 0.0.74pre
[lilypond.git] / lily / spanner.cc
1 /*
2   spanner.cc -- implement Spanner
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 "debug.hh"
10 #include "spanner.hh"
11 #include "p-col.hh"
12 #include "p-score.hh"
13
14 IMPLEMENT_STATIC_NAME(Spanner);
15 IMPLEMENT_IS_TYPE_B1(Spanner,Score_elem);
16
17 void
18 Spanner::do_print()const
19 {
20 #ifndef NPRINT
21     mtor << "Between col " << 
22         left_col_l_->rank_i() << ", " << right_col_l_->rank_i() ;
23     if (broken_into_l_arr_.size())
24         mtor << "with broken pieces\n";
25 #endif
26 }
27
28 void
29 Spanner::break_into_pieces()
30 {
31     PCol * left = left_col_l_;
32     PCol * right = right_col_l_;
33     if(left->daddy_l_) left = left->daddy_l_;
34     if(right->daddy_l_) right = right->daddy_l_;
35     
36     
37     Link_array<PCol> break_cols = pscore_l_->broken_col_range(left,right);
38     Link_array<Spanner> broken_into_l_arr;
39
40     break_cols.insert(left,0);
41     break_cols.push(right);
42
43     for (int i=1; i < break_cols.size(); i++) {
44         Spanner* span_p = clone()->spanner();
45         left = break_cols[i-1];
46         right = break_cols[i];
47         if (!right->line_l_)
48             right = right->prebreak_p_;
49         if (!left->line_l_)
50             left = left->postbreak_p_;
51
52         assert(left&&right && left->line_l_ == right->line_l_);
53
54         span_p->left_col_l_  = left;
55         span_p->right_col_l_ = right;
56         
57         pscore_l_->typeset_broken_spanner(span_p);
58         broken_into_l_arr.push( span_p );
59     }
60     
61     broken_into_l_arr_ = broken_into_l_arr;
62 }
63
64 void
65 Spanner::do_break_processing()
66 {
67     if (!left_col_l_->line_l_)
68         left_col_l_ = left_col_l_->postbreak_p_;
69     if (!right_col_l_->line_l_)
70         right_col_l_ = right_col_l_->prebreak_p_;
71      
72     
73     if (!line_l()) {
74         break_into_pieces();
75         for (int i=0; i < broken_into_l_arr_.size(); i++)
76             broken_into_l_arr_[i]->handle_broken_dependencies();
77     } else { 
78         handle_broken_dependencies();
79     }
80 }
81
82
83 Spanner::Spanner()
84 {
85     left_col_l_ = right_col_l_ = 0;
86 }
87
88
89 Interval
90 Spanner::do_width()const
91 {
92     Real r = right_col_l_->hpos;
93     Real l = left_col_l_->hpos;
94     assert(*left_col_l_ < *right_col_l_);
95     assert(r>=l);
96         
97     return Interval(0, r-l);
98 }
99
100 Line_of_score *
101 Spanner::line_l()const
102 {
103     if ( left_col_l_->line_l_ != right_col_l_->line_l_)
104         return 0;
105     return left_col_l_->line_l_;
106 }
107
108
109 Spanner*
110 Spanner::find_broken_piece(Line_of_score*l)const
111 {
112     for (int i=0; i < broken_into_l_arr_.size(); i++)
113         if(broken_into_l_arr_[i]->line_l() == l)
114             return broken_into_l_arr_[i];
115     return 0;                              
116           
117 }
118
119 bool
120 Spanner::broken_b()const
121 {
122     return broken_into_l_arr_.size();
123 }