]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-spanner.cc
modified: Documentation/user/tutorial.itely
[lilypond.git] / lily / spacing-spanner.cc
index 74e54e7eac7d308672ecb44e73e8704c37244656..99fe9824a8e1c7ca083666030a1c7dc8c7630ab7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "spacing-spanner.hh"
 */
 
 #include "spacing-spanner.hh"
@@ -137,7 +137,7 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob)
        }
     }
 
        }
     }
 
-  int max_idx = -1;
+  vsize max_idx = VPOS;
   int max_count = 0;
   for (vsize i = durations.size (); i--;)
     {
   int max_count = 0;
   for (vsize i = durations.size (); i--;)
     {
@@ -153,7 +153,7 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob)
   if (Moment *m = unsmob_moment (bsd))
     d = m->main_part_;
 
   if (Moment *m = unsmob_moment (bsd))
     d = m->main_part_;
 
-  if (max_idx >= 0)
+  if (max_idx != VPOS)
     d = min (d, durations[max_idx]);
 
   return Moment (d).smobbed_copy ();
     d = min (d, durations[max_idx]);
 
   return Moment (d).smobbed_copy ();
@@ -303,7 +303,8 @@ Spacing_spanner::generate_springs (Grob *me,
       prev = col;
     }
 
       prev = col;
     }
 
-  set_column_rods (cols, 0.1); // FIXME: padding
+  Real padding = robust_scm2double (prev->get_property ("padding"), 0.1);
+  set_column_rods (cols, padding);
 }
 
 /*
 }
 
 /*
@@ -368,16 +369,9 @@ Spacing_spanner::musical_column_spacing (Grob *me,
          else
            {
              /*
          else
            {
              /*
-               Fixed should be 0.0. If there are no spacing wishes, we're
-               likely dealing with polyphonic spacing of hemiolas.
-           
-               We used to have min_distance_ = options->increment_
-
-               but this can lead to numeric instability problems when we
-               do
-           
-               inverse_strength = (distance_ - min_distance_)
-      
+               Min distance should be 0.0. If there are no spacing
+               wishes, we're probably dealing with polyphonic spacing
+               of hemiolas.      
              */
              spring = Spring (base_note_space, 0.0);
            }
              */
              spring = Spring (base_note_space, 0.0);
            }
@@ -402,14 +396,30 @@ Spacing_spanner::musical_column_spacing (Grob *me,
     {
       /*
        In packed mode, pack notes as tight as possible.  This makes
     {
       /*
        In packed mode, pack notes as tight as possible.  This makes
-       sense mostly in combination with raggedright mode: the notes
+       sense mostly in combination with ragged-right mode: the notes
        are then printed at minimum distance.  This is mostly useful
        for ancient notation, but may also be useful for some flavours
        are then printed at minimum distance.  This is mostly useful
        for ancient notation, but may also be useful for some flavours
-       of contemporary music.  If not in raggedright mode, lily will
-       pack as much bars of music as possible into a line, but the
+       of contemporary music.  If not in ragged-right mode, lily will
+       pack as many bars of music as possible into a line, but the
        line will then be stretched to fill the whole linewidth.
        line will then be stretched to fill the whole linewidth.
+
+       Note that we don't actually pack things as tightly as possible:
+       we don't allow the next column to begin before this one ends.
+      */
+      /* FIXME: the else clause below is the "right" thing to do,
+        but we can't do it because of all the empty columns that the
+        ligature-engravers leave lying around. In that case, the extent of
+        the column is incorrect because it includes note-heads that aren't
+        there. We get around this by only including the column extent if
+        the left-hand column is "genuine". This is a dirty hack and it
+        should be fixed in the ligature-engravers. --jneem
       */
       */
-      spring.set_distance (spring.min_distance ());
+      if (Paper_column::is_extraneous_column_from_ligature (left_col))
+       spring.set_distance (spring.min_distance ());
+      else
+       spring.set_distance (max (left_col->extent (left_col, X_AXIS)[RIGHT],
+                                 spring.min_distance ()));
+
       spring.set_inverse_stretch_strength (1.0);
     }
 
       spring.set_inverse_stretch_strength (1.0);
     }
 
@@ -504,7 +514,8 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r,
       && l->break_status_dir () == CENTER
       && fills_measure (me, l, r))
     {
       && l->break_status_dir () == CENTER
       && fills_measure (me, l, r))
     {
-      spring.set_distance (spring.distance () + 1.0);
+      Real full_measure_extra_space = robust_scm2double (l->get_property ("full-measure-extra-space"), 1.0);
+      spring.set_distance (spring.distance () + full_measure_extra_space);
       spring.set_default_strength ();
     }
   
       spring.set_default_strength ();
     }