X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-column.cc;h=826b18a113f61e8506b20db3782c6cff8d637378;hb=refs%2Ftags%2Frelease%2F1.1.18;hp=f71d61ba141381a52819e95af68c86d80732ed6d;hpb=7f0a3b682bebc864fbca295deba301238d805274;p=lilypond.git diff --git a/lily/note-column.cc b/lily/note-column.cc index f71d61ba14..826b18a113 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -1,135 +1,160 @@ /* note-column.cc -- implement Note_column - source file of the LilyPond music typesetter + source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1998 Han-Wen Nienhuys */ - +#include "dot-column.hh" #include "note-column.hh" -#include "debug.hh" #include "script.hh" -#include "notehead.hh" +#include "note-head.hh" #include "stem.hh" +#include "rest.hh" +#include "debug.hh" -IMPLEMENT_STATIC_NAME(Note_column); -void -Note_column::add(Stem*stem_l) +bool +Note_column::rest_b () const { - assert(!stem_l_); - stem_l_ = stem_l; - add_dependency(stem_l); + return rest_l_arr_.size (); } -void -Note_column::add(Notehead* n_l) +Note_column::Note_column() { - head_l_arr_.push(n_l); - add_dependency(n_l); + stem_l_ = 0; + h_shift_b_ = false; + dir_ =CENTER; } void -Note_column::add(Script*s_l) +Note_column::sort() { - script_l_arr_.push(s_l); - add_dependency(s_l); + head_l_arr_.sort (Note_head::compare); } - -void -Note_column::translate(Offset o) + +Interval_t +Note_column::head_positions_interval() const { - for (int i=0; i < head_l_arr_.size(); i++) - head_l_arr_[i]->translate(o); - for (int i=0; i < script_l_arr_.size(); i++) - script_l_arr_[i]->translate(o); - if (stem_l_) - stem_l_->translate(o); -} + ((Note_column*)this)->sort(); + Interval_t iv; + + iv.set_empty (); + if (head_l_arr_.size ()) + iv = Interval_t(head_l_arr_[0]->position_i_, + head_l_arr_.top()->position_i_); + + return iv; +} +/* +Interval +Note_column::do_width () const +{ + if (head_l_arr_.size ()) + return head_l_arr_[0]->extent (X_AXIS); + else + return Interval (0,0); +} +*/ void -Note_column::do_print()const +Note_column::do_pre_processing() { - mtor << "heads: " << head_l_arr_.size() << '\n'; - mtor << "scripts: " << script_l_arr_.size() << '\n'; + if (!dir_) + { + if (stem_l_) + dir_ = stem_l_->dir_; + else if (head_l_arr_.size ()) + { + assert (false); // looks obsolete? + dir_ = sign (head_positions_interval().center ()); + } + } + Script_column::do_pre_processing(); } -Interval -Note_column::do_height()const return r + + +void +Note_column::set_stem (Stem * stem_l) { - if (stem_l_) - r.unite(stem_l_->height()); - for (int i=0; i < head_l_arr_.size(); i++) - r.unite(head_l_arr_[i]->height()); - for (int i=0; i < script_l_arr_.size(); i++) - r.unite(script_l_arr_[i]->height()); + add_support (stem_l); + stem_l_ = stem_l; + /* + don't add stem to support; mostly invisible for rest-columns (and possibly taken . .) + */ + Score_element::add_dependency (stem_l); + for (int i=0; i < script_l_arr_.size(); i++) + script_l_arr_[i]->set_stem (stem_l); } -Interval -Note_column::do_width()const return r; +void +Note_column::add_script (Script *script_l) { - if (stem_l_) - r.unite(stem_l_->width()); - for (int i=0; i < head_l_arr_.size(); i++) - r.unite(head_l_arr_[i]->width()); - for (int i=0; i < script_l_arr_.size(); i++) - r.unite(script_l_arr_[i]->width()); + Script_column::add_script (script_l) ; + if (stem_l_) + script_l->set_stem (stem_l_); } void -Note_column::do_pre_processing() +Note_column::do_substitute_dependency (Score_element*o, Score_element*n) { - if (!script_l_arr_.size()) - return; - - Array placed_l_arr_a[4]; - for (int i=0; i < script_l_arr_.size(); i++) { - Script*s_l = script_l_arr_[i]; - int j = (s_l->dir_i_ >0) ? 0 : 2; - if (!s_l->inside_staff_b_) - j ++; - - placed_l_arr_a[j].push(s_l); + if (stem_l_ == o) + { + stem_l_ = n ? dynamic_cast (n):0; } - for (int j =0; j <4; j++) { - placed_l_arr_a[j].sort( Script::compare); + if (dynamic_cast (o)) + { + head_l_arr_.substitute (dynamic_cast (o), + (n)? dynamic_cast (n) : 0); } - - Notehead *top_head_l=0; - Notehead *bot_head_l=0; - for (int i=0; i< head_l_arr_.size(); i++) { - if (head_l_arr_[i]->extremal == -1) - bot_head_l = head_l_arr_[i]; - else if (head_l_arr_[i]->extremal == 1) - top_head_l = head_l_arr_[i]; + Script_column::do_substitute_dependency (o,n); + if (dynamic_cast (o)) + { + rest_l_arr_.substitute (dynamic_cast (o), + (n)? dynamic_cast (n) : 0); } - /* argh. This sux. */ - if (!top_head_l) - top_head_l = bot_head_l; - if (!bot_head_l) - bot_head_l = top_head_l; - assert(bot_head_l && top_head_l); - Item *support_l=top_head_l; - int j; - for (j = 0; j < 2; j++ ) { - for (int i=0; i < placed_l_arr_a[j].size(); j++) { - placed_l_arr_a[j][i]->add_support(support_l); - support_l = placed_l_arr_a[j][i]; - } +} + +void +Note_column::add_head (Rhythmic_head *h) +{ + if (dynamic_cast (h)) + { + rest_l_arr_.push ((Rest*)h); + add_support (h); } - - support_l=bot_head_l; - for (; j < 4; j++ ) { - for (int i=0; i < placed_l_arr_a[j].size(); i++) { - placed_l_arr_a[j][i]->add_support(support_l); - support_l = placed_l_arr_a[j][i]; - } + if (dynamic_cast (h)) + { + head_l_arr_.push ((Note_head*) h); + add_support (h); } } -Note_column::Note_column() + +/** + translate the rest symbols + */ +void +Note_column::translate_rests (int dy_i) +{ + invalidate_cache (Y_AXIS); + for (int i=0; i < rest_l_arr_.size(); i++) + rest_l_arr_[i]->position_i_ += dy_i; +} + +void +Note_column::do_print() const +{ +#ifndef NPRINT + DOUT << "rests: " << rest_l_arr_.size() << ", "; + DOUT << "heads: " << head_l_arr_.size(); +#endif +} + +void +Note_column::set_dotcol (Dot_column *d) { - stem_l_ =0; + add_element (d); } -