]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stem.cc
* The grand 2005-2006 replace.
[lilypond.git] / lily / stem.cc
index 9cdaaa2568073c274aeaa903c57a15e23087e8e5..d5555a1e72633629f7e09a6a81f67da9e4602433 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 
   TODO: This is way too hairy
@@ -448,8 +448,6 @@ Stem::calc_positioning_done (SCM smob)
   return SCM_BOOL_T;
 }
 
-
-
 MAKE_SCHEME_CALLBACK(Stem, calc_direction, 1);
 SCM
 Stem::calc_direction (SCM smob)
@@ -463,33 +461,37 @@ Stem::calc_direction (SCM smob)
       dir = get_grob_direction (me);
     }
   else
-    dir = get_default_dir (me);
+    {
+      SCM dd = me->get_property ("default-direction");
+      dir = to_dir (dd);
+      if (!dir)
+       return me->get_property ("neutral-direction");
+    }
   
   return scm_from_int (dir);
 }
 
-/* A separate function, since this is used elsewhere too.  */
-Direction
-Stem::get_default_dir (Grob *me)
+MAKE_SCHEME_CALLBACK(Stem, calc_default_direction, 1);
+SCM
+Stem::calc_default_direction (SCM smob)
 {
+  Grob *me = unsmob_grob (smob);
+
   Direction dir = CENTER;
   int staff_center = 0;
   Interval hp = head_positions (me);
   if (!hp.is_empty ())
     {
-      int udistance = (int) (UP *hp[UP] - staff_center);
-      int ddistance = (int) (DOWN *hp[DOWN] - staff_center);
+      int udistance = (int) (UP * hp[UP] - staff_center);
+      int ddistance = (int) (DOWN * hp[DOWN] - staff_center);
       
-      if (sign (ddistance - udistance))
-       dir = Direction (sign (ddistance - udistance));
-      else
-       dir = to_dir (me->get_property ("neutral-direction"));
+      dir = Direction (sign (ddistance - udistance));
     }
-  return dir;
+  
+  return scm_from_int (dir);
 }
 
 
-
 MAKE_SCHEME_CALLBACK (Stem, height, 1);
 SCM
 Stem::height (SCM smob)
@@ -809,31 +811,38 @@ Stem::calc_stem_info (SCM smob)
 
   Real staff_space = Staff_symbol_referencer::staff_space (me);
   Grob *beam = get_beam (me);
+
+  if (beam)
+    {
+      (void) beam->get_property ("beaming");
+    }
+  
   Real beam_translation = Beam::get_beam_translation (beam);
   Real beam_thickness = Beam::get_thickness (beam);
   int beam_count = Beam::get_direction_beam_count (beam, my_dir);
+  Real length_fraction
+    = robust_scm2double (me->get_property ("length-fraction"), 1.0);
 
   /* Simple standard stem length */
   SCM details = me->get_property ("details");
   SCM lengths = scm_cdr (scm_assq (ly_symbol2scm ("beamed-lengths"), details));
-
   
   Real ideal_length
     = scm_to_double (robust_list_ref (beam_count - 1, lengths))
-
     * staff_space
+    * length_fraction
+    
     /* stem only extends to center of beam
      */
     - 0.5 * beam_thickness;
 
   /* Condition: sane minimum free stem length (chord to beams) */
   lengths = scm_cdr (scm_assq (ly_symbol2scm ("beamed-minimum-free-lengths"), details));
-  Real length_fraction
-    = robust_scm2double (me->get_property ("length-fraction"), 1.0);
 
   Real ideal_minimum_free
     = scm_to_double (robust_list_ref (beam_count - 1, lengths))
-    * staff_space * length_fraction;
+    * staff_space
+    * length_fraction;
 
   /* UGH
      It seems that also for ideal minimum length, we must use
@@ -893,7 +902,8 @@ Stem::calc_stem_info (SCM smob)
   
   Real minimum_free
     = scm_to_double (robust_list_ref (beam_count - 1, bemfl))
-    * staff_space;
+    * staff_space
+    * length_fraction;
 
   Real minimum_length = minimum_free
     + height_of_my_beams
@@ -953,6 +963,7 @@ ADD_INTERFACE (Stem, "stem-interface",
               "avoid-note-head "
               "beam "
               "beaming "
+              "default-direction "
               "details "
               "direction "
               "duration-log "