]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.1.15
authorfred <fred>
Sun, 24 Mar 2002 19:58:07 +0000 (19:58 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:58:07 +0000 (19:58 +0000)
lily/VERSION
lily/include/stem.hh
lily/stem.cc

index 7876a844d8c5263a77494217365182cfbeacdf0b..bb301778994050886eda9cec45a162a9e9cfc11d 100644 (file)
@@ -1,6 +1,6 @@
 MAJOR_VERSION = 0
 MINOR_VERSION = 1
-PATCH_LEVEL = 14
+PATCH_LEVEL = 15
 # use to send patches, always empty for released version:
 # include separator: ".postfix", "-pl" makes rpm barf
 
index f7240397b302fdfaf1b868bc0cf29b465e393b77..7ed9e4615eccb76ab2459d3e6347c38e565a9f0d 100644 (file)
@@ -31,7 +31,7 @@ class Stem : public Item {
 
   Molecule abbrev_mol () const;
     
-  Real stem_bottom_f_, stem_top_f_;
+  Drul_array<Real> yextent_drul_;
     
   /// needed for determining direction/length
   int staff_size_i_;
@@ -45,7 +45,7 @@ class Stem : public Item {
     geen gedonder, jij gaat onder.
     -1 stem points down, +1: stem points up
     */
-  Real stem_xoffset_f_;
+  Direction  stem_xdir_;
 
   Link_array<Note_head> head_l_arr_;
   Link_array<Rest> rest_l_arr_;
@@ -97,6 +97,7 @@ public:
   Real stem_length_f() const;
   Real stem_end_f() const;
   Real stem_start_f() const;
+  Real note_delta_f () const;
 
   bool invisible_b() const;
     
index 60f7b1bad336edfdce8a3d64213fa2667e925665..a2aa5c55c4b7b5b85facd55522258cee705f6c95 100644 (file)
@@ -34,12 +34,12 @@ Stem::Stem ()
   beams_left_i_ = 0;
   beams_right_i_ = 0;
 
-  stem_bottom_f_ = stem_top_f_ = 0;
+  yextent_drul_[DOWN] = yextent_drul_[UP] = 0;
   flag_i_ = 2;
   dir_ = CENTER;
+  stem_xdir_ = LEFT;
   staff_size_i_ = 8;
 
-  stem_xoffset_f_ =0;
   beam_gap_i_ = 0;
 }
 
@@ -75,19 +75,19 @@ Stem::do_print () const
 Real 
 Stem::stem_length_f () const
 {
-  return stem_top_f_-stem_bottom_f_ ;
+  return yextent_drul_[UP]-yextent_drul_[DOWN] ;
 }
 
 Real
 Stem::stem_start_f () const
 {
-  return (dir_ < 0)? stem_top_f_ : stem_bottom_f_;
+  return (dir_ < 0)? yextent_drul_[UP] : yextent_drul_[DOWN];
 }
 
 Real
 Stem::stem_end_f () const
 {
-  return (dir_ < 0)? stem_bottom_f_ : stem_top_f_;
+  return (dir_ < 0)? yextent_drul_[DOWN] : yextent_drul_[UP];
 }
 
 
@@ -99,8 +99,8 @@ Stem::set_stemend (Real se)
          (se <= min_head_i () && dir_ <0)))    
     warning ("Weird stem size; check for narrow beams");
 
-  stem_top_f_  = (dir_ < 0) ? max_head_i () : se;
-  stem_bottom_f_  = (dir_ < 0) ? se  : min_head_i ();
+  yextent_drul_[UP]  = (dir_ < 0) ? max_head_i () : se;
+  yextent_drul_[DOWN]  = (dir_ < 0) ? se  : min_head_i ();
 }
 
 int
@@ -207,13 +207,11 @@ Stem::set_default_extents ()
 
   set_stemend ((dir_< 0) ? 
               max_head_i ()-stem_length_f (): min_head_i () + stem_length_f ());
-  // ugh, a whole ball is wider
+  
+  if (dir_ == UP)
+    stem_xdir_ = RIGHT;
   if (head_l_arr_[0]->balltype_i_ <= 0)
-    stem_xoffset_f_ = paper ()->note_width () / 2;
-  else if (dir_ > 0)   
-    stem_xoffset_f_ = paper ()->note_width () - paper ()->rule_thickness ();
-  else
-    stem_xoffset_f_ = 0;
+    stem_xdir_ = CENTER;
 }
 
 /*
@@ -242,7 +240,7 @@ Stem::set_noteheads ()
       if (dy <= 1) 
        {
          if (parity)
-           head_l_arr_[i]->x_dir_ = (stem_xoffset_f_>0) ? UP:DOWN;
+           head_l_arr_[i]->x_dir_ = (stem_xdir_ == LEFT) ? LEFT : RIGHT;
          parity = !parity;
        }
       else
@@ -254,7 +252,7 @@ Stem::set_noteheads ()
 void
 Stem::do_pre_processing ()
 {
-  if (stem_bottom_f_== stem_top_f_)
+  if (yextent_drul_[DOWN]== yextent_drul_[UP])
     set_default_extents ();
   set_noteheads ();
   flag_i_ = flag_i_;
@@ -276,8 +274,8 @@ Stem::do_width () const
   else
     {
       Paper_def*p= paper ();
-      r = p->lookup_l ()->flag (flag_i_, dir_).dim.x ();
-      r+= stem_xoffset_f_;
+      r = p->lookup_l ()->flag (flag_i_, dir_).dim_.x ();
+      r += note_delta_f ();
     }
   return r;
 }
@@ -285,10 +283,10 @@ Stem::do_width () const
 
   
 Molecule
- Stem::abbrev_mol () const
+Stem::abbrev_mol () const
 {
   Real dy = paper ()->interbeam_f ();
-  Real w = 1.5 * paper ()->lookup_l ()->ball (2).dim.x ().length ();
+  Real w = 1.5 * paper ()->lookup_l ()->ball (2).dim_.x ().length ();
   Real beamdy = paper ()->interline_f () / 2;
  
   int beams_i = 0;
@@ -326,8 +324,8 @@ Molecule*
 {
   Molecule *mol_p =new Molecule;
   
-  Real bot  = stem_bottom_f_;
-  Real top = stem_top_f_;
+  Real bot  = yextent_drul_[DOWN];
+  Real top = yextent_drul_[UP];
   
   assert (bot!=top);
   
@@ -336,28 +334,43 @@ Molecule*
   Real dy = p->internote_f ();
   if (!invisible_b ())
     {
-      Symbol ss =p->lookup_l ()->stem (bot*dy,top*dy);
+      Atom ss =p->lookup_l ()->stem (bot*dy,top*dy);
       mol_p->add (Atom (ss));
     }
   
   if (!beam_l_ &&abs (flag_i_) > 2)
     {
-      Symbol fl = p->lookup_l ()->flag (flag_i_, dir_);
+      Atom fl = p->lookup_l ()->flag (flag_i_, dir_);
       mol_p->add_at_edge (Y_AXIS, dir_, Molecule (Atom (fl)));
       assert (!abbrev_flag_i_);
     }
   
   if (abbrev_flag_i_)
     mol_p->add (abbrev_mol ());
-  
-  mol_p->translate (stem_xoffset_f_, X_AXIS);
+
+  if (head_l_arr_.size())
+    {
+      mol_p->translate (note_delta_f (), X_AXIS);
+    }
   return mol_p;
 }
 
+Real 
+Stem::note_delta_f () const
+{
+  Real r=0;
+  if (head_l_arr_.size())
+    {
+      r += head_l_arr_[0]->width ().length() * (stem_xdir_+1.0)/2.0;
+      if (stem_xdir_ == RIGHT)
+       r -= paper ()->rule_thickness ();
+    }
+  return r;
+}
 Real
- Stem::hpos_f () const
+Stem::hpos_f () const
 {
-  return Item::hpos_f () + stem_xoffset_f_;
+  return note_delta_f () +Item::hpos_f ();
 }