]> git.donarmstrong.com Git - lilypond.git/blob - lily/p-col.cc
9e5be116646cac5dc2ba974513f8778e1d1f5c95
[lilypond.git] / lily / p-col.cc
1 /*
2   p-col.cc -- implement PCol
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "p-col.hh"
10 #include "p-score.hh"
11
12 #include "debug.hh"
13
14 Interval
15 PCol::width() const
16 {
17   Interval w;
18
19   for (iter_top (its,i); i.ok(); i++)
20         w.unite (i->width());
21   if (w.empty_b())
22         w.unite (Interval (0,0));
23   return w;
24 }
25
26 void
27 PCol::clean_breakable_items()
28 {
29   if (!line_l_) 
30     {
31         its.junk_links();
32     }
33   if (prebreak_p_) 
34         prebreak_p_->clean_breakable_items();
35   if (postbreak_p_) 
36         postbreak_p_->clean_breakable_items();
37 }
38
39 int
40 PCol::rank_i() const
41 {
42   return rank_i_;
43 }
44
45 void
46 PCol::set_rank (int i)
47 {
48   rank_i_ = i;
49   if (prebreak_p_)
50         prebreak_p_->rank_i_ = i;
51   if (postbreak_p_)
52         postbreak_p_->rank_i_ = i;
53 }
54
55 void
56 PCol::print() const
57 {
58 #ifndef NPRINT
59   DOUT << "PCol {";
60
61   DOUT << "rank: " << rank_i_ << '\n';
62
63   DOUT << "# symbols: " << its.size() ;
64      if (prebreak_p_){
65         DOUT << "\npre: ";
66         prebreak_p_->print();
67     }
68     if (postbreak_p_) {
69       DOUT << "post: ";
70       postbreak_p_->print();
71     } 
72   else if (daddy_l_) 
73     {
74         DOUT <<'\n' << ((this == daddy_l_->prebreak_p_) ?
75                        "prebreak" : "postbreak");
76         DOUT << '\n';
77     }
78   DOUT << "extent: " << width().str () << "\n";
79   DOUT << "}\n";
80 #endif 
81 }
82
83 int
84 PCol::compare (PCol const &c1, PCol const &c2)
85 {
86   return c1.rank_i() - c2.rank_i ();
87 }
88
89 void
90 PCol::OK() const
91 {
92 #ifndef NDEBUG
93   if (prebreak_p_ || postbreak_p_) 
94     {
95         assert (prebreak_p_&&postbreak_p_);
96         assert (prebreak_p_->daddy_l_ == this);
97         assert (postbreak_p_->daddy_l_ == this);
98     }
99 #endif
100 }
101
102 void
103 PCol::set_breakable()
104 {
105   if (breakable_b())
106         return;
107
108   do_set_breakable();
109   prebreak_p_->pscore_l_ = pscore_l_;
110   postbreak_p_->pscore_l_ = pscore_l_;
111
112   prebreak_p_->daddy_l_ = postbreak_p_->daddy_l_ = this;
113 }
114 void
115 PCol::do_set_breakable()
116 {
117    prebreak_p_ = new PCol;
118   postbreak_p_ = new PCol;
119 }
120   
121
122 bool
123 PCol::breakpoint_b() const
124 {
125   return !line_l_;
126 }
127
128 bool
129 PCol::breakable_b() const
130 {
131   return prebreak_p_||postbreak_p_||daddy_l_;
132 }
133
134 PCol::PCol()
135 {
136   used_b_ = false;
137   error_mark_b_ = false;
138   daddy_l_ = 0;
139   prebreak_p_=0;
140   postbreak_p_=0;
141   line_l_=0;
142   hpos_f_ = -1.0;
143   pscore_l_ = 0;
144   rank_i_ = -1;
145 }
146
147 PCol::~PCol()
148 {
149   delete prebreak_p_;
150   delete postbreak_p_;
151 }
152
153 void
154 PCol::add (Item *i)
155 {
156   its.bottom().add (i);
157   i->pcol_l_ = this; 
158 }
159
160 bool
161 PCol::used_b()const
162 {
163   return daddy_l_ || breakable_b() || its.size ()|| used_b_;
164 }