]> git.donarmstrong.com Git - lilypond.git/blob - lily/p-col.cc
3ace8fba82341f3a0d35ffd87020385919d118f3
[lilypond.git] / lily / p-col.cc
1 #include "p-col.hh"
2 #include "p-score.hh"
3 #include "p-staff.hh"
4 #include "debug.hh"
5
6 Interval
7 PCol::width() const
8 {
9     Interval w;
10
11     for (iter_top(its,i); i.ok(); i++)
12         w.unite(i->width());
13     if (w.empty())
14         w.unite(Interval(0,0));
15     return w;
16 }
17
18 int
19 PCol::rank() const
20 {
21 #if 0
22     if(!pscore_l_)
23         return -1;
24     PCursor<PCol*> me=pscore_l_->find_col( (PCol*)this);
25     if (!me.ok())
26         return -1;
27     PCursor<PCol*> bot(pscore_l_->cols.top());
28     return me - bot;
29 #endif
30     assert(rank_i_ != -1);
31     return rank_i_;
32 }
33
34 void
35 PCol::set_rank(int i)
36 {
37     rank_i_ = i;
38     if (prebreak_p_)
39         prebreak_p_->rank_i_ = i;
40     if (postbreak_p_)
41         postbreak_p_->rank_i_ = i;
42 }
43
44 void
45 PCol::print() const
46 {
47 #ifndef NPRINT
48     mtor << "PCol {";
49
50     if (rank() >= 0)
51         mtor << "rank: " << rank_i_ << '\n';
52
53     mtor << "# symbols: " << its.size() ;
54     if (breakable_b()){
55         mtor << "\npre,post: ";
56         prebreak_p_->print();
57         postbreak_p_->print();
58     } else if (daddy_l_) {
59         mtor<<'\n' << ((this == daddy_l_->prebreak_p_) ?
60                        "prebreak" : "postbreak");
61         mtor << '\n';
62     }
63     mtor << "extent: " << width().str() << "\n";
64     mtor << "}\n";
65 #endif 
66 }
67
68 int
69 PCol::compare(PCol const &c1, PCol const &c2)
70 {
71     return c1.rank() - c2.rank();
72 }
73
74 void
75 PCol::OK() const
76 {
77 #ifndef NDEBUG
78     if (prebreak_p_ || postbreak_p_ ) {
79         assert(prebreak_p_&&postbreak_p_);
80         assert(prebreak_p_->daddy_l_ == this);
81         assert(postbreak_p_->daddy_l_ == this);
82     }
83 #endif
84 }
85
86 void
87 PCol::set_breakable()
88 {
89     if (breakable_b())
90         return;
91
92     prebreak_p_ = new PCol(this);
93     postbreak_p_ = new PCol(this);
94     prebreak_p_->pscore_l_ = pscore_l_;
95     postbreak_p_->pscore_l_ = pscore_l_;
96 }
97
98 bool
99 PCol::breakable_b() const
100 {
101     return prebreak_p_||postbreak_p_;
102 }
103
104 PCol::PCol(PCol *parent)
105 {
106     daddy_l_ = parent;
107     prebreak_p_=0;
108     postbreak_p_=0;
109     line_l_=0;
110     hpos = -1.0;
111     pscore_l_ = 0;
112 }
113
114 PCol::~PCol()
115 {
116     delete prebreak_p_;
117     delete postbreak_p_;        
118 }
119
120 void
121 PCol::add( Item *i)
122 {
123     its.bottom().add(i);
124     i->pcol_l_ = this; 
125 }
126
127 bool
128 PCol::used_b()const
129 {
130     return breakable_b() || its.size();
131 }