]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stem.cc
Add beam typenames to typename list.
[lilypond.git] / lily / stem.cc
index 074620e06956a9d8e304a33064509b24333fd015..11cf6def8b6e66d4d02045fb85b1dd31aa77a76c 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1996--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 
   TODO: This is way too hairy
@@ -255,7 +255,13 @@ Stem::pure_height (SCM smob,
 
   if (!to_boolean (me->get_property ("cross-staff")))
     {
-      Real len = scm_to_double (calc_length (smob)) * ss / 2;
+      Real len_in_halfspaces;
+      SCM user_set_len_scm = me->get_property_data ("length");
+      if (scm_is_number (user_set_len_scm))
+       len_in_halfspaces = scm_to_double (user_set_len_scm);
+      else
+       len_in_halfspaces = scm_to_double (calc_length (smob));
+      Real len = len_in_halfspaces * ss / 2;
       Direction dir = get_grob_direction (me);
 
       Interval hp = head_positions (me);
@@ -908,21 +914,26 @@ Stem::calc_stem_info (SCM smob)
   SCM lengths = ly_assoc_get (ly_symbol2scm ("beamed-lengths"), details, SCM_EOL);
   
   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;
+    = (scm_is_pair (lengths)
+       ? (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)
+       : 0.0);
 
   /* Condition: sane minimum free stem length (chord to beams) */
-  lengths = ly_assoc_get (ly_symbol2scm ("beamed-minimum-free-lengths"), details, SCM_EOL);
+  lengths = ly_assoc_get (ly_symbol2scm ("beamed-minimum-free-lengths"),
+                         details, SCM_EOL);
 
   Real ideal_minimum_free
-    = scm_to_double (robust_list_ref (beam_count - 1, lengths))
-    * staff_space
-    * length_fraction;
+    = (scm_is_pair (lengths)
+       ? (scm_to_double (robust_list_ref (beam_count - 1, lengths))
+         * staff_space
+         * length_fraction)
+       : 0.0);
 
   Real height_of_my_trem = 0.0;
   Grob *trem = unsmob_grob (me->get_object ("tremolo-flag"));
@@ -939,7 +950,7 @@ Stem::calc_stem_info (SCM smob)
      It seems that also for ideal minimum length, we must use
      the maximum beam count (for this direction):
 
-     \score{ \notes\relative c''{ [a8 a32] }}
+     \score { \relative c'' { a8[ a32] } }
 
      must be horizontal. */
   Real height_of_my_beams = beam_thickness
@@ -993,9 +1004,11 @@ Stem::calc_stem_info (SCM smob)
                            details, SCM_EOL);
   
   Real minimum_free
-    = scm_to_double (robust_list_ref (beam_count - 1, bemfl))
-    * staff_space
-    * length_fraction;
+    = (scm_is_pair (bemfl)
+       ? (scm_to_double (robust_list_ref (beam_count - 1, bemfl))
+         * staff_space
+         * length_fraction)
+       : 0.0);
 
   Real minimum_length = max (minimum_free, height_of_my_trem)
     + height_of_my_beams