]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.56
authorfred <fred>
Sun, 24 Mar 2002 19:40:13 +0000 (19:40 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:40:13 +0000 (19:40 +0000)
lily/staff-elem.cc
lily/stem.cc

index 191f072de227b0bba4840f630ea9ed4fd4773e35..331ffbe92fddffe064bfc54a65111c8ff13b4850 100644 (file)
@@ -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
index 5e26f0561870ecd2d5f8183a77c353610e1e47ea..ee3bc643018ec8f2e582307e6071d904f40a5ba7 100644 (file)
 
 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 <? head_l_arr_[i]->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_;
 }