]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-spanner.cc
Fixed typo in mailmap
[lilypond.git] / lily / spacing-spanner.cc
index ba5d40e51879ffe7f5b7709c51cbfed96579ed41..cc5170de79eba2763dc1ed5b9406b390542fe705 100644 (file)
@@ -3,7 +3,7 @@
 
   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"
@@ -168,7 +168,7 @@ Spacing_spanner::generate_pair_spacing (Grob *me,
   if (Paper_column::is_musical (left_col))
     {
       if (!Paper_column::is_musical (right_col)
-         && options->float_nonmusical_columns_
+         && (options->float_nonmusical_columns_ || to_boolean (right_col->get_property ("maybe-loose")))
          && after_right_col
          && Paper_column::is_musical (after_right_col))
        {
@@ -303,7 +303,8 @@ Spacing_spanner::generate_springs (Grob *me,
       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);
 }
 
 /*
@@ -323,21 +324,33 @@ Spacing_spanner::musical_column_spacing (Grob *me,
   else
     {
       vector<Spring> springs;
-      extract_grob_set (left_col, "right-neighbors", neighbors);
+      extract_grob_set (left_col, "spacing-wishes", wishes);
 
-      for (vsize i = 0; i < neighbors.size (); i++)
+      for (vsize i = 0; i < wishes.size (); i++)
        {
-         Grob *wish = neighbors[i];
+         Grob *wish = wishes[i];
+         if (Spacing_interface::left_column (wish) != left_col)
+           {
+             /* This shouldn't really happen, but the ancient music
+                stuff really messes up the spacing code, grrr
+             */
+             continue;
+           }
 
-         Item *wish_rcol = Spacing_interface::right_column (wish);
-         if (Spacing_interface::left_column (wish) != left_col
-             || (wish_rcol != right_col && wish_rcol != right_col->original ()))
-           continue;
+         extract_grob_set (wish, "right-items", right_items);
+         bool found_matching_column = false;
+         for (vsize j = 0; j < right_items.size (); j++)
+           {
+             Item *it = dynamic_cast<Item*> (right_items[j]);
+             if (it && (right_col == it->get_column ()
+                        || right_col->original () == it->get_column ()))
+               found_matching_column = true;
+           }
 
          /*
            This is probably a waste of time in the case of polyphonic
            music.  */
-         if (Note_spacing::has_interface (wish))
+         if (found_matching_column && Note_spacing::has_interface (wish))
            {
              Real inc = options->increment_;
              Grob *gsp = unsmob_grob (left_col->get_object ("grace-spacing"));
@@ -405,8 +418,20 @@ Spacing_spanner::musical_column_spacing (Grob *me,
        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.
       */
-      spring.set_distance (max (left_col->extent (left_col, X_AXIS)[RIGHT],
-                               spring.min_distance ()));
+      /* 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
+      */
+      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);
     }
 
@@ -501,7 +526,8 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *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 ();
     }