X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-column.cc;h=e528b9e956369d94ace5744e9f76161ee7745808;hb=c844072722a39a5fcd20372b0497d9130bd41dd7;hp=f0c518a5b78fee195de4bcd86296352d3ff77a08;hpb=56126108b2610f82bc7cafaac8741d1aeba1d34f;p=lilypond.git diff --git a/lily/note-column.cc b/lily/note-column.cc index f0c518a5b7..e528b9e956 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -1,64 +1,153 @@ /* 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) -{ - stem_l_ = stem_l; - add_support(stem_l); -} +IMPLEMENT_IS_TYPE_B1(Note_column,Script_column); -void -Note_column::add(Notehead* n_l) +bool +Note_column::rest_b () const { - assert(!n_l->rest_b_); - head_l_arr_.push(n_l); - add_support(n_l); + return rest_l_arr_.size (); } Note_column::Note_column() { - stem_l_ = 0; - h_shift_b_ =false; - dir_i_ =0; + stem_l_ = 0; + h_shift_b_ = false; + dir_ =CENTER; } void Note_column::sort() { - head_l_arr_.sort( Notehead::compare); + head_l_arr_.sort (Note_head::compare); } - + Interval_t -Note_column::head_positions_interval()const +Note_column::head_positions_interval() const { - ( (Note_column*)this)->sort(); - return Interval_t ( head_l_arr_[0]->position_i_, - head_l_arr_.top()->position_i_); + ((Note_column*)this)->sort(); + return Interval_t (head_l_arr_[0]->position_i_, + head_l_arr_.top()->position_i_); } +Interval +Note_column::width () const +{ + if (head_l_arr_.size ()) + return head_l_arr_[0]->width (); + else + return Interval (0,0); +} void Note_column::do_pre_processing() { - if (!dir_i_){ - if (stem_l_) - dir_i_ = stem_l_->dir_i_; - else - dir_i_ = (head_positions_interval().center() >= 5) ? -1 : 1; + + if (!dir_) + { + if (stem_l_) + dir_ = stem_l_->dir_; + else if (head_l_arr_.size ()) + { + dir_ = (head_positions_interval().center () >= 5) ? DOWN:UP; + } } + Script_column::do_pre_processing(); +} + + + +void +Note_column::set (Stem * stem_l) +{ + add_support (stem_l); + stem_l_ = stem_l; + /* + don't add stem to support; mostly invisible for rest-columns (and possibly taken . .) + */ + Score_elem::add_dependency (stem_l); + for (int i=0; i < script_l_arr_.size(); i++) + script_l_arr_[i]->set_stem (stem_l); +} + +void +Note_column::add (Script *script_l) +{ + Script_column::add (script_l) ; + if (stem_l_) + script_l->set_stem (stem_l_); +} + +void +Note_column::do_substitute_dependency (Score_elem*o, Score_elem*n) +{ + if (stem_l_ == o) + { + stem_l_ = n ? (Stem*)n->item():0; + } + if (o->is_type_b (Note_head::static_name ())) + { + head_l_arr_.substitute ((Note_head*)o->item(), + (n)? (Note_head*)n->item() : 0); + } + Script_column::do_substitute_dependency (o,n); + if (o->is_type_b (Rest::static_name ())) + { + rest_l_arr_.substitute ((Rest*)o->item(), + (n)? (Rest*)n->item() : 0); + } +} + +void +Note_column::add (Rhythmic_head *h) +{ + if (h->is_type_b (Rest::static_name ())) + { + rest_l_arr_.push ((Rest*)h); + add_support (h); + } + if (h->is_type_b (Note_head::static_name ())) + { + head_l_arr_.push ((Note_head*) h); + add_support (h); + } +} + +/** + 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 (Dot_column *d) +{ + add_element (d); }