X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fp-col.cc;h=a3903ab016d001693c66b0d347a2d3a772f7aa70;hb=refs%2Ftags%2Frelease%2F1.1.29;hp=eb7a78ef10412f34cafa9e3c8a8029124cf7b494;hpb=0dc651561ed849b121d26cbd07a192e9fefeb832;p=lilypond.git diff --git a/lily/p-col.cc b/lily/p-col.cc index eb7a78ef10..a3903ab016 100644 --- a/lily/p-col.cc +++ b/lily/p-col.cc @@ -1,147 +1,148 @@ /* - p-col.cc -- implement PCol + p-col.cc -- implement Paper_column source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "p-col.hh" #include "p-score.hh" - #include "debug.hh" -Interval -PCol::width() const -{ - Interval w; - - for (iter_top(its,i); i.ok(); i++) - w.unite(i->width()); - if (w.empty_b()) - w.unite(Interval(0,0)); - return w; -} - void -PCol::clean_breakable_items() +Paper_column::add_rod (Paper_column * p, Real d) { - if (!line_l_) { - its.junk_links(); + Direction dir = Direction (sign (p->rank_i () - rank_i ())); + for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++) + { + Column_rod &rod = minimal_dists_arr_drul_[dir][i]; + if (rod.other_l_ == p) + { + rod.distance_f_ = rod.distance_f_ >? d; + return ; + } } - if (prebreak_p_) prebreak_p_->clean_breakable_items(); - if (postbreak_p_) postbreak_p_->clean_breakable_items(); + + Column_rod cr; + cr.distance_f_ = d; + cr.other_l_ = p; + + minimal_dists_arr_drul_[dir].push (cr); + } int -PCol::rank_i() const +Paper_column::rank_i() const { - assert(rank_i_ != -1); - return rank_i_; + return rank_i_; } void -PCol::set_rank(int i) +Paper_column::set_rank (int i) { - rank_i_ = i; - if (prebreak_p_) - prebreak_p_->rank_i_ = i; - if (postbreak_p_) - postbreak_p_->rank_i_ = i; + rank_i_ = i; + if (prebreak_l()) + prebreak_l()->rank_i_ = i; + if (postbreak_l()) + postbreak_l()->rank_i_ = i; } void -PCol::print() const +Paper_column::do_print() const { #ifndef NPRINT - mtor << "PCol {"; - - mtor << "rank: " << rank_i_ << '\n'; - - mtor << "# symbols: " << its.size() ; - if (breakable_b()){ - mtor << "\npre,post: "; - prebreak_p_->print(); - postbreak_p_->print(); - } else if (daddy_l_) { - mtor<<'\n' << ((this == daddy_l_->prebreak_p_) ? - "prebreak" : "postbreak"); - mtor << '\n'; + DOUT << "rank: " << rank_i_ << '\n'; + if (prebreak_l()) + { + DOUT << "\npre: "; + prebreak_l()->print(); + } + if (postbreak_l()) + { + DOUT << "post: "; + postbreak_l()->print(); + } + if (break_status_dir_) + { + DOUT << '\n' << ((break_status_dir_ == LEFT) ? "prebreak" : "postbreak"); + DOUT << '\n'; + } + + DOUT << "Left: "; + for (int i=0; i < minimal_dists_arr_drul_[LEFT].size (); i++) + { + minimal_dists_arr_drul_[LEFT][i].print (); + } + DOUT << "Right: "; + for (int i=0; i < minimal_dists_arr_drul_[RIGHT].size (); i++) + { + minimal_dists_arr_drul_[RIGHT][i].print (); } - mtor << "extent: " << width().str() << "\n"; - mtor << "}\n"; #endif } int -PCol::compare(PCol const &c1, PCol const &c2) +Paper_column::compare (Paper_column const &c1, Paper_column const &c2) { - return c1.rank_i() - c2.rank_i(); + return c1.rank_i() - c2.rank_i (); } -void -PCol::OK() const +Paper_column* +Paper_column::prebreak_l() const { -#ifndef NDEBUG - if (prebreak_p_ || postbreak_p_ ) { - assert(prebreak_p_&&postbreak_p_); - assert(prebreak_p_->daddy_l_ == this); - assert(postbreak_p_->daddy_l_ == this); - } -#endif + return dynamic_cast(broken_to_drul_[LEFT]); } -void -PCol::set_breakable() +Paper_column* +Paper_column::postbreak_l() const { - if (breakable_b()) - return; - - prebreak_p_ = new PCol(this); - postbreak_p_ = new PCol(this); - prebreak_p_->pscore_l_ = pscore_l_; - postbreak_p_->pscore_l_ = pscore_l_; + return dynamic_cast( broken_to_drul_[RIGHT]); } - bool -PCol::breakpoint_b() const +Paper_column::breakpoint_b() const { - return !line_l_; + return !line_l_; } -bool -PCol::breakable_b() const +Paper_column::Paper_column() +{ + used_b_ = false; + error_mark_b_ = false; + line_l_=0; + rank_i_ = -1; +} + +Line_of_score* +Paper_column::line_l() const { - return prebreak_p_||postbreak_p_; + return line_l_; } -PCol::PCol(PCol *parent) +bool +Paper_column::used_b() const { - error_mark_b_ = false; - daddy_l_ = parent; - prebreak_p_=0; - postbreak_p_=0; - line_l_=0; - hpos = -1.0; - pscore_l_ = 0; - rank_i_ = -1; + return linked_b(); } -PCol::~PCol() + + +Paper_column* +Paper_column::column_l () const { - delete prebreak_p_; - delete postbreak_p_; + return (Paper_column*)(this); } + void -PCol::add( Item *i) +Paper_column::preprocess () { - its.bottom().add(i); - i->pcol_l_ = this; + minimal_dists_arr_drul_[LEFT].sort (Column_rod::compare); + minimal_dists_arr_drul_[RIGHT].sort (Column_rod::compare); } bool -PCol::used_b()const +Paper_column::breakable_b () const { - return breakable_b() || its.size(); + return breakable_b_; }