X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspanner.cc;h=25b9855f23d4e11bf5c494cdec7214a70f830e40;hb=31653bf1d61a33ef8bc8c871d60c6b3452d04d28;hp=1ca347172bda6db6fa9a73820a3c22c76d78760c;hpb=48bdd9154a32245a075494b403639181615864e2;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index 1ca347172b..25b9855f23 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -3,132 +3,216 @@ source file of the GNU LilyPond music typesetter - (c) 1996,1997 Han-Wen Nienhuys + (c) 1996, 1997--1998 Han-Wen Nienhuys */ #include "debug.hh" #include "spanner.hh" #include "p-col.hh" #include "p-score.hh" +#include "molecule.hh" +#include "paper-outputter.hh" - -IMPLEMENT_IS_TYPE_B1(Spanner,Score_elem); +IMPLEMENT_IS_TYPE_B1(Spanner,Score_element); void -Spanner::do_print()const +Spanner::do_print() const { #ifndef NPRINT - mtor << "Between col "; -// huh? this does not work -// mtor << ( left_col_l_ ? left_col_l_->rank_i() : "nop" ); - if ( left_col_l_ ) - mtor << left_col_l_->rank_i(); - else - mtor << "nop"; - mtor << ", "; -// mtor << ( right_col_l_ ? right_col_l_->rank_i() : "nop" ); - if ( right_col_l_ ) - mtor << right_col_l_->rank_i(); - else - mtor << "nop"; - if (broken_into_l_arr_.size()) - mtor << "with broken pieces\n"; + DOUT << "Between " << spanned_drul_[LEFT]->name () + << " and " << spanned_drul_[RIGHT]->name() << '\n'; + if (broken_into_l_arr_.size()) + { + DOUT << "with broken pieces:\n"; + for (int i=0; i < broken_into_l_arr_.size (); i++) + broken_into_l_arr_[i]->print (); + } #endif } void -Spanner::break_into_pieces() -{ - PCol * left = left_col_l_; - PCol * right = right_col_l_; - if(left->daddy_l_) left = left->daddy_l_; - if(right->daddy_l_) right = right->daddy_l_; - - - Link_array break_cols = pscore_l_->broken_col_range(left,right); - Link_array broken_into_l_arr; - - break_cols.insert(left,0); - break_cols.push(right); - - for (int i=1; i < break_cols.size(); i++) { - Spanner* span_p = clone()->spanner(); - left = break_cols[i-1]; - right = break_cols[i]; - if (!right->line_l_) - right = right->prebreak_p_; - if (!left->line_l_) - left = left->postbreak_p_; - - assert(left&&right && left->line_l_ == right->line_l_); - - span_p->left_col_l_ = left; - span_p->right_col_l_ = right; +Spanner::break_into_pieces () +{ + if (broken_into_l_arr_.size()) + return; + + Item * left = spanned_drul_[LEFT]; + Item * right = spanned_drul_[RIGHT]; + + if (left == right) + { + warning (_ ("left spanpoint is right spanpoint\n")); + return; + } + + Link_array break_cols = pscore_l_->broken_col_range (left,right); + Link_array broken_into_l_arr; + + break_cols.insert (left,0); + break_cols.push (right); + + for (int i=1; i < break_cols.size(); i++) + { + Spanner* span_p = dynamic_cast (clone()); + Item *left = break_cols[i-1]; + Item *right = break_cols[i]; + if (!right->line_l()) + right = right->find_prebroken_piece(LEFT); + if (!left->line_l()) + left = left->find_prebroken_piece(RIGHT); + + assert (left&&right && left->line_l() == right->line_l()); + + span_p->set_bounds(LEFT,left); + span_p->set_bounds(RIGHT,right); - pscore_l_->typeset_broken_spanner(span_p); - broken_into_l_arr.push( span_p ); + pscore_l_->typeset_broken_spanner (span_p); + broken_into_l_arr.push (span_p); } - - broken_into_l_arr_ = broken_into_l_arr; + + broken_into_l_arr_ = broken_into_l_arr; +} + +void +Spanner::set_my_columns() +{ + Direction i = (Direction)1; + do + { + if (!spanned_drul_[i]->line_l()) + set_bounds(i,spanned_drul_[i]->find_prebroken_piece((Direction)-i)); + } + while (flip(&i) != 1); +} + + +void +Spanner::set_bounds(Direction d, Item*i) +{ + if (spanned_drul_[d]) + spanned_drul_[d]->attached_span_l_arr_.substitute(this,0); + + spanned_drul_[d] =i; + if (i) + i->attached_span_l_arr_.push(this); + + if (spanned_drul_[Direction(-d)] == spanned_drul_[d] + && i) + warning (_f ("Spanner `%s\' with equal left and right spanpoints", name ())); } void Spanner::do_break_processing() { - if (!left_col_l_->line_l_) - left_col_l_ = left_col_l_->postbreak_p_; - if (!right_col_l_->line_l_) - right_col_l_ = right_col_l_->prebreak_p_; - - - if (!line_l()) { - break_into_pieces(); - for (int i=0; i < broken_into_l_arr_.size(); i++) - broken_into_l_arr_[i]->handle_broken_dependencies(); - } else { - handle_broken_dependencies(); + if (!line_l()) + { + break_into_pieces (); + for (int i=0; i < broken_into_l_arr_.size(); i++) + { + broken_into_l_arr_[i]->handle_broken_dependencies(); + } + } + else + { + handle_broken_dependencies(); } } +Spanner::Spanner () +{ + unbroken_original_l_ =0; + spanned_drul_[LEFT]=0; + spanned_drul_[RIGHT]=0; +} -Spanner::Spanner() +Spanner::Spanner (Spanner const &s) + :Score_element (s) { - left_col_l_ = right_col_l_ = 0; + spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0; + unbroken_original_l_ = &s; } +void +Spanner::do_brew_molecule () +{ + if (transparent_b_) + return ; + Molecule *output= brew_molecule_p (); + Offset left_off (spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), 0); + Offset o = absolute_offset() + left_off; + pscore_l_->outputter_l_->output_molecule (output, o, name ()); + delete output; +} Interval -Spanner::do_width()const +Spanner::do_width() const { - Real r = right_col_l_->hpos_f_; - Real l = left_col_l_->hpos_f_; - assert(*left_col_l_ < *right_col_l_); - assert(r>=l); + Real l = spanned_drul_[LEFT]->absolute_coordinate (X_AXIS); + Real r = spanned_drul_[RIGHT]->absolute_coordinate (X_AXIS); + assert (r>=l); - return Interval(0, r-l); + return Interval (0, r-l); } Line_of_score * -Spanner::line_l()const +Spanner::line_l() const { - if ( left_col_l_->line_l_ != right_col_l_->line_l_) - return 0; - return left_col_l_->line_l_; + if (!spanned_drul_[LEFT] || !spanned_drul_[RIGHT]) + return 0; + if (spanned_drul_[LEFT]->line_l() != spanned_drul_[RIGHT]->line_l()) + return 0; + return spanned_drul_[LEFT]->line_l(); } Spanner* -Spanner::find_broken_piece(Line_of_score*l)const +Spanner::find_broken_piece (Line_of_score*l) const { - for (int i=0; i < broken_into_l_arr_.size(); i++) - if(broken_into_l_arr_[i]->line_l() == l) - return broken_into_l_arr_[i]; - return 0; + for (int i=0; i < broken_into_l_arr_.size(); i++) + if (broken_into_l_arr_[i]->line_l() == l) + return broken_into_l_arr_[i]; + return 0; } bool -Spanner::broken_b()const +Spanner::broken_b() const { - return broken_into_l_arr_.size(); + return broken_into_l_arr_.size(); +} + +void +Spanner::do_unlink() +{ + set_bounds (LEFT, 0); + set_bounds (RIGHT, 0); + + if (unbroken_original_l_) + { + unbroken_original_l_->broken_into_l_arr_.substitute (this, 0); + unbroken_original_l_ =0; + } +} + +void +Spanner::do_junk_links() +{ + spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0; +} + +Array +Spanner::get_rods () const +{ + Array r; + return r; +} + +void +Spanner::do_space_processing () +{ + Array rs (get_rods ()); + for (int i=0; i < rs.size (); i++) + { + rs[i].add_to_cols (); + } }