X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspanner.cc;h=0a1a74e5bd09c62a67acc44958a1c111fd8da743;hb=55fa3168d0fb5326341ff56d7a1638c89eb2ebaf;hp=eac107ba8dc113e7c4d51a2c529cc9feb2edd5c4;hpb=13e79c0250d34b6bdfbafbc551ef64e8b59b2991;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index eac107ba8d..0a1a74e5bd 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -3,49 +3,49 @@ 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 "tex-outputter.hh" +#include "molecule.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 - DOUT << "Between col "; - if ( left_col_l_) - DOUT << left_col_l_->rank_i(); - else - DOUT << "nop"; - DOUT << ", "; - if ( right_col_l_) - DOUT << right_col_l_->rank_i(); - else - DOUT << "nop"; + DOUT << "Between " << spanned_drul_[LEFT]->name () + << " and " << spanned_drul_[RIGHT]->name() << '\n'; if (broken_into_l_arr_.size()) - DOUT << "with broken pieces\n"; + { + 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 (bool copy_deps_b) +Spanner::break_into_pieces () { - if ( broken_into_l_arr_.size()) - return; + if (broken_into_l_arr_.size()) + return; - 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_; + 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 break_cols = pscore_l_->broken_col_range (left,right); Link_array broken_into_l_arr; break_cols.insert (left,0); @@ -53,23 +53,21 @@ Spanner::break_into_pieces (bool copy_deps_b) for (int i=1; i < break_cols.size(); i++) { - Spanner* span_p = clone()->spanner (); - if (copy_deps_b) - span_p->copy_dependencies (*this); - 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* span_p = clone()->access_Spanner (); + 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; @@ -78,68 +76,149 @@ Spanner::break_into_pieces (bool copy_deps_b) void Spanner::set_my_columns() { - 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_; + 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::do_break_processing() +Spanner::set_bounds(Direction d, Item*i) { - set_my_columns(); + if (spanned_drul_[d]) + spanned_drul_[d]->attached_span_l_arr_.substitute(this,0); - if (!line_l()) + 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 (!line_l()) { - break_into_pieces (true); - for (int i=0; i < broken_into_l_arr_.size(); i++) - broken_into_l_arr_[i]->handle_broken_dependencies(); + 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(); + handle_broken_dependencies(); } } +Spanner* +Spanner::access_Spanner () +{ + return this; +} -Spanner::Spanner() +Spanner::Spanner () { - left_col_l_ = right_col_l_ = 0; + unbroken_original_l_ =0; + spanned_drul_[LEFT]=0; + spanned_drul_[RIGHT]=0; } +Spanner::Spanner (Spanner const &s) + :Score_element (s) +{ + 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_); + 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); } 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]; + 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(); } + +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 (); + } +}