]> git.donarmstrong.com Git - lilypond.git/blob - lily/spanner.cc
release: 0.0.77.jcn1
[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
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 // huh? this does not work 
23 //    mtor << ( left_col_l_ ? left_col_l_->rank_i() : "nop" );
24     if ( left_col_l_ )
25         mtor << left_col_l_->rank_i();
26     else 
27         mtor << "nop";
28     mtor << ", ";
29 //    mtor << ( right_col_l_ ? right_col_l_->rank_i() : "nop" );
30     if ( right_col_l_ )
31         mtor << right_col_l_->rank_i();
32     else 
33         mtor << "nop";
34     if (broken_into_l_arr_.size())
35         mtor << "with broken pieces\n";
36 #endif
37 }
38
39 void
40 Spanner::break_into_pieces()
41 {
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_;
46     
47     
48     Link_array<PCol> break_cols = pscore_l_->broken_col_range(left,right);
49     Link_array<Spanner> broken_into_l_arr;
50
51     break_cols.insert(left,0);
52     break_cols.push(right);
53
54     for (int i=1; i < break_cols.size(); i++) {
55         Spanner* span_p = clone()->spanner();
56         left = break_cols[i-1];
57         right = break_cols[i];
58         if (!right->line_l_)
59             right = right->prebreak_p_;
60         if (!left->line_l_)
61             left = left->postbreak_p_;
62
63         assert(left&&right && left->line_l_ == right->line_l_);
64
65         span_p->left_col_l_  = left;
66         span_p->right_col_l_ = right;
67         
68         pscore_l_->typeset_broken_spanner(span_p);
69         broken_into_l_arr.push( span_p );
70     }
71     
72     broken_into_l_arr_ = broken_into_l_arr;
73 }
74
75 void
76 Spanner::do_break_processing()
77 {
78     if (!left_col_l_->line_l_)
79         left_col_l_ = left_col_l_->postbreak_p_;
80     if (!right_col_l_->line_l_)
81         right_col_l_ = right_col_l_->prebreak_p_;
82      
83     
84     if (!line_l()) {
85         break_into_pieces();
86         for (int i=0; i < broken_into_l_arr_.size(); i++)
87             broken_into_l_arr_[i]->handle_broken_dependencies();
88     } else { 
89         handle_broken_dependencies();
90     }
91 }
92
93
94 Spanner::Spanner()
95 {
96     left_col_l_ = right_col_l_ = 0;
97 }
98
99
100 Interval
101 Spanner::do_width()const
102 {
103     Real r = right_col_l_->hpos_f_;
104     Real l = left_col_l_->hpos_f_;
105     assert(*left_col_l_ < *right_col_l_);
106     assert(r>=l);
107         
108     return Interval(0, r-l);
109 }
110
111 Line_of_score *
112 Spanner::line_l()const
113 {
114     if ( left_col_l_->line_l_ != right_col_l_->line_l_)
115         return 0;
116     return left_col_l_->line_l_;
117 }
118
119
120 Spanner*
121 Spanner::find_broken_piece(Line_of_score*l)const
122 {
123     for (int i=0; i < broken_into_l_arr_.size(); i++)
124         if(broken_into_l_arr_[i]->line_l() == l)
125             return broken_into_l_arr_[i];
126     return 0;                              
127           
128 }
129
130 bool
131 Spanner::broken_b()const
132 {
133     return broken_into_l_arr_.size();
134 }