From 67e3b1edf274065996aaa6718b0bda5744246b65 Mon Sep 17 00:00:00 2001 From: fred Date: Sun, 24 Mar 2002 19:40:13 +0000 Subject: [PATCH] lilypond-0.0.56 --- lily/staff-elem.cc | 14 +++- lily/stem.cc | 189 ++++++++++++++++++++++++++++----------------- 2 files changed, 128 insertions(+), 75 deletions(-) diff --git a/lily/staff-elem.cc b/lily/staff-elem.cc index 191f072de2..331ffbe92f 100644 --- a/lily/staff-elem.cc +++ b/lily/staff-elem.cc @@ -40,7 +40,10 @@ Staff_elem::Staff_elem(Staff_elem const&s) */ Staff_elem::~Staff_elem() { - delete output; + assert(status < DELETED); + delete output; + status = DELETED; + output = 0; } void @@ -50,8 +53,9 @@ Staff_elem::translate(Offset O) } Interval -Staff_elem::do_width() const return r; +Staff_elem::do_width() const { + Interval r; if (!output){ Molecule*m = brew_molecule_p(); @@ -59,7 +63,9 @@ Staff_elem::do_width() const return r; delete m; } else r = output->extent().x; + return r; } + Interval Staff_elem::width() const { @@ -71,14 +77,16 @@ Staff_elem::width() const return r; } Interval -Staff_elem::do_height() const return r +Staff_elem::do_height() const { + Interval r; if (!output){ Molecule*m = brew_molecule_p(); r = m->extent().y; delete m; } else r = output->extent().y; + return r; } Interval diff --git a/lily/stem.cc b/lily/stem.cc index 5e26f05618..ee3bc64301 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -10,20 +10,38 @@ const int STEMLEN=7; +int +Stem::min_head_i()const +{ + int m = 1000; + for (int i =0; i < head_l_arr_.size(); i++) + m = m position_i_; + return m; +} -Stem::Stem(int c) //, Moment len) +int +Stem::max_head_i() const { - beams_left = 0; - beams_right = 0; - minnote = 1000; // invalid values - maxnote = -1000; - bot = top = 0; - flag = 4; + int m = -1000; + for (int i =0; i < head_l_arr_.size(); i++) + m = m >? head_l_arr_[i]->position_i_; + return m; + +} + +Stem::Stem(int c) +{ + beams_left_i_ = 0; + beams_right_i_ = 0; + + stem_bottom_f_ = stem_top_f_ = 0; + flag_i_ = 4; dir_i_ =0; - staff_center=c; - stemlen=0; - print_flag=true; - stem_xoffset=0; + staff_size_i_ = c; + + print_flag_b_=true; + stem_xoffset_f_ =0; + } IMPLEMENT_STATIC_NAME(Stem); @@ -32,46 +50,68 @@ void Stem::do_print() const { #ifndef NPRINT - mtor << "flag "<< flag << " print_flag " << print_flag - << "min,max [" << minnote << ", " << maxnote << "]"; + mtor << "flag "<< flag_i_ << " print_flag_b_ " << print_flag_b_; + #endif } + +Real +Stem::stem_length_f()const +{ + return stem_top_f_-stem_bottom_f_ ; +} + +Real +Stem::stem_start_f()const +{ + return (dir_i_ < 0)? stem_top_f_ : stem_bottom_f_; +} + +Real +Stem::stem_end_f() const +{ + return (dir_i_ < 0)? stem_bottom_f_ : stem_top_f_; +} + void Stem::set_stemend(Real se) { - // todo: margins - if (! ((dir_i_ > 0 && se >= maxnote) || (se <= minnote && dir_i_ <0)) ) + if (! ((dir_i_ > 0 && se >= max_head_i()) || + (se <= min_head_i() && dir_i_ <0)) ) warning("Weird stem size; check for narrow beams"); - - top = (dir_i_ < 0) ? maxnote : se; - bot = (dir_i_ < 0) ? se : minnote; - flag = dir_i_*abs(flag); + + stem_top_f_ = (dir_i_ < 0) ? max_head_i() : se; + stem_bottom_f_ = (dir_i_ < 0) ? se : min_head_i(); } void Stem::add(Notehead *n) { - assert(status < PRECALCED); - - if (n->balltype == 1) - return; - int p = n->position; - if (p < minnote) - minnote = p; - if (p > maxnote) - maxnote = p; - heads.push(n); n->add_dependency(this); + if (n->rest_b_) { + rest_l_arr_.push(n); + } else if (n->balltype_i_ == 1) { + whole_l_arr_.push(n); + return; + } else{ + head_l_arr_.push(n); + } } +bool +Stem::invisible_b()const +{ + return !head_l_arr_.size(); +} int Stem::get_default_dir() { + int staff_center = staff_size_i_ /2; if (dir_i_) return dir_i_; - Real mean = (minnote+maxnote)/2; + Real mean = (min_head_i() + max_head_i())/2; return (mean > staff_center) ? -1: 1; } @@ -87,90 +127,94 @@ Stem::set_default_stemlen() if (!dir_i_) set_default_dir(); - int stafftop = 2*staff_center; - stemlen = STEMLEN + (maxnote - minnote); // uhh... how about non 5-line staffs? - if (maxnote < -2 && dir_i_ == 1){ - int t = staff_center - staff_center/2; - stemlen = t - minnote +2; - } else if (minnote > stafftop + 2 && dir_i_ == -1) { - int t = staff_center + staff_center/2; - stemlen = maxnote -t +2; - } + if ((max_head_i() < -2 && dir_i_ == 1 ) + ||(min_head_i() > staff_size_i_ + 2 && dir_i_ == -1) ){ + set_stemend( staff_size_i_ /2 ); + } else { + set_stemend( (dir_i_ > 0) ? max_head_i() + STEMLEN : + min_head_i() - STEMLEN); - assert(stemlen); + } } void Stem::set_default_extents() { - if (minnote > maxnote) { - warning("Empty stem. Ugh!"); - minnote = -10; - maxnote = 20; - } - - if (!stemlen) + if (!stem_length_f()) set_default_stemlen(); - set_stemend((dir_i_< 0) ? maxnote-stemlen: minnote +stemlen); + set_stemend((dir_i_< 0) ? + max_head_i()-stem_length_f(): min_head_i() +stem_length_f()); if (dir_i_ > 0){ - stem_xoffset = paper()->note_width()-paper()->rule_thickness(); + stem_xoffset_f_ = paper()->note_width()-paper()->rule_thickness(); } else - stem_xoffset = 0; + stem_xoffset_f_ = 0; } void Stem::set_noteheads() { - if(!heads.size()) + if(!head_l_arr_.size()) return; - heads.sort(Notehead::compare); - heads[0]->extremal = -1; - heads.top()->extremal = 1; + head_l_arr_.sort(Notehead::compare); + head_l_arr_[0]->extremal_i_ = -1; + head_l_arr_.top()->extremal_i_ = 1; int parity=1; - int lastpos = heads[0]->position; - for (int i=1; i < heads.size(); i ++) { - int dy =abs(lastpos- heads[i]->position); + int lastpos = head_l_arr_[0]->position_i_; + for (int i=1; i < head_l_arr_.size(); i ++) { + int dy =abs(lastpos- head_l_arr_[i]->position_i_); if (dy <= 1) { if (parity) - heads[i]->x_dir = (stem_xoffset>0) ? 1:-1; + head_l_arr_[i]->x_dir_i_ = (stem_xoffset_f_>0) ? 1:-1; parity = !parity; } else parity = 0; - lastpos = heads[i]->position; + lastpos = head_l_arr_[i]->position_i_; } } void Stem::do_pre_processing() { - if (bot == top) + if (stem_bottom_f_== stem_top_f_) set_default_extents(); set_noteheads(); + flag_i_ = dir_i_*abs(flag_i_); } Interval Stem::do_width()const { - if (!print_flag || abs(flag) <= 4) + if (!print_flag_b_ || abs(flag_i_) <= 4) return Interval(0,0); // TODO! Paper_def*p= paper(); - Interval r(p->lookup_l()->flag(flag).dim.x); - r+= stem_xoffset; + Interval r(p->lookup_l()->flag(flag_i_).dim.x); + r+= stem_xoffset_f_; return r; } Molecule* -Stem::brew_molecule_p()const return out; +Stem::brew_molecule_p()const { + Molecule *out =0; + if ( invisible_b() ) + return Staff_elem::brew_molecule_p(); + + Real bot = stem_bottom_f_; + Real top = stem_top_f_; + if (min_head_i() > max_head_i()) { + warning("Empty stem. Ugh!"); + bot = -10; + top = 20; + } + assert(bot!=top); - Paper_def *p =paper(); Real dy = p->internote(); @@ -178,24 +222,25 @@ Stem::brew_molecule_p()const return out; out = new Molecule(Atom(ss)); - if (print_flag&&abs(flag) > 4){ - Symbol fl = p->lookup_l()->flag(flag); + if (print_flag_b_&&abs(flag_i_) > 4){ + Symbol fl = p->lookup_l()->flag(flag_i_); Molecule m(fl); - if (flag < -4){ + if (flag_i_ < -4){ out->add_bottom(m); - } else if (flag > 4) { + } else if (flag_i_ > 4) { out->add_top(m); } else assert(false); } - out->translate(Offset(stem_xoffset,0)); + out->translate(Offset(stem_xoffset_f_,0)); + return out; } Real -Stem::hindex()const +Stem::hpos_f()const { - return hpos_f() + stem_xoffset; + return Item::hpos_f() + stem_xoffset_f_; } -- 2.39.5