]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-spanner.cc
Imported Upstream version 2.14.2
[lilypond.git] / lily / spacing-spanner.cc
index 99fe9824a8e1c7ca083666030a1c7dc8c7630ab7..0395506bbcb79dbecc9e1423e08bcee9d821bdc0 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  spacing-spanner.cc -- implement Spacing_spanner
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1999--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "spacing-spanner.hh"
@@ -38,8 +49,8 @@ Spacing_spanner::get_columns (Grob *me_grob)
   vsize end = binary_search (all, (Grob*) me->get_bound (RIGHT),
                             &Paper_column::less_than);  
   
-  all = vector<Grob*>::vector<Grob*> (all.begin () + start,
-                                     all.begin () + end + 1);
+  all = vector<Grob*> (all.begin () + start,
+                      all.begin () + end + 1);
   return all;
 }
 
@@ -168,7 +179,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))
        {
@@ -260,7 +271,7 @@ set_column_rods (vector<Grob*> const &cols, Real padding)
              bool touches = right_stickout - left_stickout + cur_dist[d] < 0.0;
              Real dist = 0.0;
 
-             /* we set a distance for the line-starter column even if it's non-broken counterpart
+             /* we set a distance for the line-starter column even if its non-broken counterpart
                 doesn't touch the right column. */
              if (lb)
                Separation_item::set_distance (lb, r_col, padding);
@@ -274,6 +285,7 @@ set_column_rods (vector<Grob*> const &cols, Real padding)
              if (j == i-1)
                cur_dist[d] = distances[j];
 
+             cur_dist[d] = max (cur_dist[d], dist);
              done = done && !touches;
            }
          while (flip (&d) != LEFT && rb);
@@ -324,21 +336,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"));
@@ -516,7 +540,7 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r,
     {
       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_compress_strength ();
     }
   
   if (options->stretch_uniformly_ && l->break_status_dir () != RIGHT)