]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/key-item.cc
release: 1.3.49
[lilypond.git] / lily / key-item.cc
index c39f0e4e5cfcec987d9f85ceec7844fcb8375bcd..e6b8df7b4493e1f14fea0f5f2df3e7c5d41775f3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1996--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
   keyplacement by Mats Bengtsson
 */
@@ -22,29 +22,10 @@ const int SHARP_TOP_PITCH=4; /*  ais and bis typeset in lower octave */
 
 Key_item::Key_item ()
 {
-  multi_octave_b_ = false;
   set_elt_property ("breakable", SCM_BOOL_T);
-  set_c_position (0);
+  set_elt_property ("c0-position", gh_int2scm (0));
 }
 
-int
-Key_item::get_c_position () const
-{
-  // Find the c in the range -4 through 2
-  int from_bottom_pos = c0_position_ + 4;      
-  from_bottom_pos = from_bottom_pos%7;
-  from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive.
-  return from_bottom_pos - 4;
-}
-
-
-void 
-Key_item::set_c_position (int c0)
-{
-  c0_position_ = c0;
-}
-
-
 void
 Key_item::add (int p, int a)
 {
@@ -63,29 +44,37 @@ Key_item::add_old (int p, int a)
 int
 Key_item::calculate_position(int p, int a) const
 {
-  if (multi_octave_b_) 
+  if (to_boolean (get_elt_property ("multi-octave")))
     {
-      return p + c0_position_;
+      return p + gh_scm2int (get_elt_property ("c0-position"));
     }
   else {
-    if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+get_c_position ()>4)) && (p+get_c_position ()>1)) 
+    // Find the c in the range -4 through 2
+    int from_bottom_pos = gh_scm2int (get_elt_property ("c0-position")) + 4;
+    from_bottom_pos = from_bottom_pos%7;
+    from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive.
+    int c0 = from_bottom_pos - 4;
+
+    
+    if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+c0>4)) && (p+c0>1)) 
        ||
-       (a>0 && ((p>SHARP_TOP_PITCH) || (p+get_c_position ()>5)) && (p+get_c_position ()>2))) 
+       (a>0 && ((p>SHARP_TOP_PITCH) || (p+c0>5)) && (p+c0>2))) 
       {
        p -= 7; /* Typeset below c_position */
       }
     /* Provide for the four cases in which there's a glitch */
     /* it's a hack, but probably not worth */
     /* the effort of finding a nicer solution. dl. */
-    if (get_c_position ()==2 && a>0 && p==3)
+    if (c0==2 && a>0 && p==3)
       p -= 7;
-    if (get_c_position ()==-3 && a>0 && p==-1)
+    if (c0==-3 && a>0 && p==-1)
       p += 7;
-    if (get_c_position ()==-4 && a<0 && p==-1)
+    if (c0==-4 && a<0 && p==-1)
       p += 7;
-    if (get_c_position ()==-2 && a<0 && p==-3)
+    if (c0==-2 && a<0 && p==-3)
       p += 7;
-    return p + get_c_position ();
+    
+    return p + c0;
   }
 }
 
@@ -94,13 +83,13 @@ Key_item::calculate_position(int p, int a) const
   - space the `natural' signs wider
   - dehair this
  */
-Molecule*
-Key_item::do_brew_molecule_p() const
+Molecule 
+Key_item::do_brew_molecule() const
 {
-  Molecule*output = new Molecule;
+  Molecule mol;
 
   Staff_symbol_referencer_interface si (this);
-  Real inter = si.staff_line_leading_f ()/2.0;
+  Real inter = si.staff_space ()/2.0;
   
   int j;
   if ((break_status_dir () == LEFT || break_status_dir () == CENTER)
@@ -119,7 +108,7 @@ Key_item::do_brew_molecule_p() const
               Molecule m =lookup_l ()->afm_find ("accidentals-0");
 
               m.translate_axis (calculate_position(old_pitch_arr_[i], old_acc_arr_[i]) * inter, Y_AXIS);
-              output->add_at_edge (X_AXIS, RIGHT, m,0);        
+              mol.add_at_edge (X_AXIS, RIGHT, m,0);    
             }
         }
 
@@ -131,17 +120,17 @@ Key_item::do_brew_molecule_p() const
       Interval x(0, inter);
       Interval y(0,0);
 
-      output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y)),0);
+      mol.add_at_edge (X_AXIS, RIGHT, lookup_l()->blank (Box(x,y)),0);
     }
  
   for (int i =0; i < pitch_arr_.size(); i++) 
     {
       Molecule m = lookup_l ()->afm_find ("accidentals-" + to_str (acc_arr_[i]));
       m.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS);
-      output->add_at_edge (X_AXIS, RIGHT, m, 0);
+      mol.add_at_edge (X_AXIS, RIGHT, m, 0);
     }
 
-  return output;
+  return mol;
 }