]> git.donarmstrong.com Git - lilypond.git/blobdiff - src/beam.cc
release: 0.0.38
[lilypond.git] / src / beam.cc
index 1016320deae1339c35785637aff3a4e3ebde1fc9..64f3e3cf775aa721316b216328443bcc8b468584 100644 (file)
@@ -1,3 +1,5 @@
+#include "varray.hh"
+
 #include "dimen.hh"
 #include "beam.hh"
 #include "misc.hh"
@@ -7,17 +9,18 @@
 #include "leastsquares.hh"
 #include "pcol.hh"
 #include "stem.hh"
-#include "paper.hh"
+#include "paper-def.hh"
 #include "lookup.hh"
 #include "grouping.hh"
 
+
+
 struct Stem_info {
     Real x;
     Real idealy;
     Real miny;
     int no_beams;
 
-    ///////////////
     
     Stem_info(){}
     Stem_info(const Stem*);
@@ -25,26 +28,23 @@ struct Stem_info {
 
 Stem_info::Stem_info(const Stem*s)
 {
-    x = s->hpos();
+    x = s->hindex();
     int dir = s->dir;
     idealy  = max(dir*s->top, dir*s->bot);
     miny = max(dir*s->minnote, dir*s-> maxnote);
     assert(miny <= idealy);
-    no_beams = s->flag;
+
 }
 
-/****************/
+/* *************** */
+
 Offset
 Beam::center()const
 {
     assert(status >= POSTCALCED);
-    if (calc_children){                // URGGGG!!!
-       Beam*me_p = (Beam*)this;
-       me_p->do_post_processing();
-    }
-    Real w=width().length()/2;
-    return Offset(w,
-                  (left_pos + w* slope)*paper()->interline());
+
+    Real w=(paper()->note_width() + width().length())/2.0;
+    return Offset(w, (left_pos + w* slope)*paper()->internote());
 }
 
 
@@ -52,14 +52,13 @@ Beam::Beam()
 {
     slope = 0;
     left_pos = 0.0;
-    dir =0;
 }
 
 void
 Beam::add(Stem*s)
 {
     stems.bottom().add(s);
-    s->dependencies.add(this);
+    s->add_dependency(this);
     s->print_flag = false;
 }
 
@@ -69,12 +68,12 @@ Beam::set_default_dir()
     int dirs[2];
     dirs[0]=0; dirs[1] =0;
     for (iter_top(stems,i); i.ok(); i++) {
-       i->set_default_dir();
-       dirs[(i->dir+1)/2] ++;
+       int d = i->get_default_dir();
+       dirs[(d+1)/2] ++;
     }
-    dir =  (dirs[0] > dirs[1]) ? -1 : 1;
+    dir_i_ =  (dirs[0] > dirs[1]) ? -1 : 1;
     for (iter_top(stems,i); i.ok(); i++) {
-       i->dir = dir;
+       i->dir = dir_i_;
     }
 }
 
@@ -88,13 +87,13 @@ Beam::solve_slope()
     for (iter_top(stems,i); i.ok(); i++) {
        i->set_default_extents();
        Stem_info info(i);
-       sinfo.add(info);
+       sinfo.push(info);
     }
     Real leftx = sinfo[0].x;
     Least_squares l;
     for (int i=0; i < sinfo.size(); i++) {
        sinfo[i].x -= leftx;
-       l.input.add(Offset(sinfo[i].x, sinfo[i].idealy));
+       l.input.push(Offset(sinfo[i].x, sinfo[i].idealy));
     }
 
     l.minimise(slope, left_pos);
@@ -107,12 +106,12 @@ Beam::solve_slope()
            dy = my -y; 
     }
     left_pos += dy;
-    left_pos *= dir;    
-    slope *= dir;
+    left_pos *= dir_i_;    
+    slope *= dir_i_;
 
                                // URG
     Real sl = slope*paper()->internote();
-    paper()->lookup_p_->beam(sl, convert_dimen(20,"pt"));
+    paper()->lookup_p_->beam(sl, 20 PT);
     slope = sl /paper()->internote();
 }
 
@@ -120,9 +119,9 @@ void
 Beam::set_stemlens()
 {
     iter_top(stems,s);
-    Real x0 = s->hpos();    
+    Real x0 = s->hindex();    
     for (; s.ok() ; s++) {
-       Real x =  s->hpos()-x0;
+       Real x =  s->hindex()-x0;
        s->set_stemend(left_pos + slope * x);   
     }
 }
@@ -151,12 +150,12 @@ Beam::set_grouping(Rhythmic_grouping def, Rhythmic_grouping cur)
        for (; s.ok(); s++) {
            int f = intlog2(abs(s->flag))-2;
            assert(f>0);
-           flags.add(f);
+           flags.push(f);
        }
        int fi =0;
        b= cur.generate_beams(flags, fi);
        b.insert(0,0);
-       b.add(0);
+       b.push(0);
        assert(stems.size() == b.size()/2);
     }
 
@@ -172,7 +171,9 @@ Beam::set_grouping(Rhythmic_grouping def, Rhythmic_grouping cur)
 Spanner *
 Beam::do_break_at( PCol *, PCol *) const
 {
-    return new Beam(*this);
+    Beam *beam_p= new Beam(*this);
+    
+    return beam_p;
 }
 
 void
@@ -181,7 +182,7 @@ Beam::do_pre_processing()
     left  = (*stems.top())   ->pcol_l_;
     right = (*stems.bottom())->pcol_l_;    
     assert(stems.size()>1);
-    if (!dir)
+    if (!dir_i_)
        set_default_dir();
 
 }
@@ -191,8 +192,8 @@ Interval
 Beam::width() const
 {
     Beam * me = (Beam*) this;  // ugh
-    return Interval( (*me->stems.top()) ->hpos(),
-                    (*me->stems.bottom()) ->hpos() );
+    return Interval( (*me->stems.top()) ->hindex(),
+                    (*me->stems.bottom()) ->hindex() );
 }
 
 /*
@@ -201,12 +202,12 @@ Beam::width() const
 Molecule
 Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
 {
-    assert( !next || next->hpos() > here->hpos()  );
-    assert( !prev || prev->hpos() < here->hpos()  );
+    assert( !next || next->hindex() > here->hindex()  );
+    assert( !prev || prev->hindex() < here->hindex()  );
     Real dy=paper()->internote()*2;
     Real stemdx = paper()->rule_thickness();
     Real sl = slope*paper()->internote();
-    paper()->lookup_p_->beam(sl, convert_dimen(20,"pt"));
+    paper()->lookup_p_->beam(sl, 20 PT);
 
     Molecule leftbeams;
     Molecule rightbeams;
@@ -215,12 +216,15 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
     if (prev) {
        int lhalfs= lhalfs = here->beams_left - prev->beams_right ;
        int lwholebeams= here->beams_left <? prev->beams_right ;
-       Real w = (here->hpos() - prev->hpos())/4;
-       Atom a =  paper()->lookup_p_->beam(sl, w);
+       Real w = (here->hindex() - prev->hindex())/4;
+       Symbol dummy;
+       Atom a(dummy);
+       if (lhalfs)             // generates warnings if not
+           a =  paper()->lookup_p_->beam(sl, w);
        a.translate(Offset (-w, -w * sl));
        for (int j = 0; j  < lhalfs; j++) {
            Atom b(a);
-           b.translate(Offset(0, -dir * dy * (lwholebeams+j)));
+           b.translate(Offset(0, -dir_i_ * dy * (lwholebeams+j)));
            leftbeams.add( b );
        }
     }
@@ -229,21 +233,23 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
        int rhalfs = here->beams_right - next->beams_left;
        int rwholebeams = here->beams_right <? next->beams_left; 
 
-       Real w = next->hpos() - here->hpos();
+       Real w = next->hindex() - here->hindex();
        Atom a = paper()->lookup_p_->beam(sl, w + stemdx);
        
        int j = 0;
        for (; j  < rwholebeams; j++) {
            Atom b(a);
-           b.translate(Offset(0, -dir * dy * j));
+           b.translate(Offset(0, -dir_i_ * dy * j));
            rightbeams.add( b ); 
        }
+
        w /= 4;
-       a = paper()->lookup_p_->beam(sl, w);
+       if (rhalfs)
+           a = paper()->lookup_p_->beam(sl, w);
        
        for (; j  < rwholebeams + rhalfs; j++) {
            Atom b(a);
-           b.translate(Offset(0, -dir * dy * j));
+           b.translate(Offset(0, -dir_i_ * dy * j));
            rightbeams.add(b ); 
        }
        
@@ -254,11 +260,11 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
 
 
 Molecule*
-Beam::brew_molecule() const return out;
+Beam::brew_molecule_p() const return out;
 {
     Real inter=paper()->internote();
     out = new Molecule;
-    Real x0 = stems.top()->hpos();
+    Real x0 = stems.top()->hindex();
     
     for (iter_top(stems,i); i.ok(); i++) {
        PCursor<Stem*> p(i-1);
@@ -267,7 +273,7 @@ Beam::brew_molecule() const return out;
        Stem * next = n.ok() ? n.ptr() : 0;
 
        Molecule sb = stem_beams(i, next, prev);
-       Real  x = i->hpos()-x0;
+       Real  x = i->hindex()-x0;
        sb.translate(Offset(x, (x * slope  + left_pos)* inter));
        out->add(sb);
     }
@@ -275,12 +281,11 @@ Beam::brew_molecule() const return out;
 }
 
 void
-Beam::print()const
+Beam::do_print()const
 {
 #ifndef NPRINT
-    mtor << "slope " <<slope << "left ypos " << left_pos;
+    mtor << "slope " <<slope << "left ypos " << left_pos;
     Spanner::print();
-    mtor << "}\n";
 #endif
 }