]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-spanner.cc
MusicXML: do not dist ily files twice.
[lilypond.git] / lily / spacing-spanner.cc
index 19739adf6a5ee8ddd520932c33c80750a93f3d99..ba5d40e51879ffe7f5b7709c51cbfed96579ed41 100644 (file)
@@ -21,6 +21,7 @@
 #include "paper-score.hh"
 #include "pointer-group-interface.hh"
 #include "separation-item.hh"
 #include "paper-score.hh"
 #include "pointer-group-interface.hh"
 #include "separation-item.hh"
+#include "skyline-pair.hh"
 #include "spaceable-grob.hh"
 #include "spacing-interface.hh"
 #include "staff-spacing.hh"
 #include "spaceable-grob.hh"
 #include "spacing-interface.hh"
 #include "staff-spacing.hh"
@@ -136,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--;)
     {
@@ -152,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 ();
@@ -216,15 +217,25 @@ set_column_rods (vector<Grob*> const &cols, Real padding)
 
   for (vsize i = 1; i < cols.size (); i++)
     {
 
   for (vsize i = 1; i < cols.size (); i++)
     {
+      assert (distances.size () == i-1);
+
       Item *r = dynamic_cast<Item*> (cols[i]);
       Item *rb = r->find_prebroken_piece (LEFT);
 
       if (Separation_item::is_empty (r) && (!rb || Separation_item::is_empty (rb)))
       Item *r = dynamic_cast<Item*> (cols[i]);
       Item *rb = r->find_prebroken_piece (LEFT);
 
       if (Separation_item::is_empty (r) && (!rb || Separation_item::is_empty (rb)))
-       continue;
+       {
+         distances.push_back (0);
+         continue;
+       }
 
       Skyline_pair *skys = Skyline_pair::unsmob (r->get_property ("horizontal-skylines"));
       Real right_stickout = skys ? (*skys)[LEFT].max_height () : 0.0;
 
 
       Skyline_pair *skys = Skyline_pair::unsmob (r->get_property ("horizontal-skylines"));
       Real right_stickout = skys ? (*skys)[LEFT].max_height () : 0.0;
 
+      /* min rather than max because right-stickout will be negative if the right-hand column
+        sticks out a lot to the left */
+      right_stickout = min (right_stickout,
+                           Separation_item::conditional_skyline (r, cols[i-1]).max_height ());
+
       Drul_array<Item*> r_cols (r, rb);
       Drul_array<Real> cur_dist (0.0, 0.0);
 
       Drul_array<Item*> r_cols (r, rb);
       Drul_array<Real> cur_dist (0.0, 0.0);
 
@@ -327,7 +338,17 @@ Spacing_spanner::musical_column_spacing (Grob *me,
            This is probably a waste of time in the case of polyphonic
            music.  */
          if (Note_spacing::has_interface (wish))
            This is probably a waste of time in the case of polyphonic
            music.  */
          if (Note_spacing::has_interface (wish))
-           springs.push_back (Note_spacing::get_spacing (wish, right_col, base_note_space, options->increment_));
+           {
+             Real inc = options->increment_;
+             Grob *gsp = unsmob_grob (left_col->get_object ("grace-spacing"));
+             if (gsp && Paper_column::when_mom (left_col).grace_part_)
+               {
+                 Spacing_options grace_opts;
+                 grace_opts.init_from_grob (gsp);
+                 inc = grace_opts.increment_;
+               }
+             springs.push_back (Note_spacing::get_spacing (wish, right_col, base_note_space, inc));
+           }
        }
 
       if (springs.empty ())
        }
 
       if (springs.empty ())
@@ -347,16 +368,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);
            }
@@ -381,14 +395,18 @@ 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.
       */
       */
-      spring.set_distance (spring.min_distance ());
+      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);
     }
 
@@ -497,18 +515,20 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r,
 }
 
 ADD_INTERFACE (Spacing_spanner,
 }
 
 ADD_INTERFACE (Spacing_spanner,
-              "The space taken by a note is dependent on its duration. Doubling a\n"
-              "duration adds spacing-increment to the space. The most common shortest\n"
-              "note gets @code{shortest-duration-space}. Notes that are even shorter are\n"
-              "spaced proportonial to their duration.\n"
+              "The space taken by a note is dependent on its duration."
+              "  Doubling a duration adds @code{spacing-increment} to the"
+              " space.  The most common shortest note gets"
+              " @code{shortest-duration-space}.  Notes that are even shorter"
+              " are spaced proportonial to their duration.\n"
               "\n"
               "\n"
-              "Typically, the increment is the width of a black note head.  In a\n"
-              "piece with lots of 8th notes, and some 16th notes, the eighth note\n"
-              "gets 2 note heads width (i.e. the space following a note is 1 note\n"
-              "head width) A 16th note is followed by 0.5 note head width. The\n"
-              "quarter note is followed by  3 NHW, the half by 4 NHW, etc.\n",
-
-              
+              "Typically, the increment is the width of a black note head."
+              "  In a piece with lots of 8th notes, and some 16th notes, the"
+              " eighth note gets a 2@tie{}note heads width (i.e., the space"
+              " following a note is a 1@tie{}note head width).  A 16th note"
+              " is followed by 0.5 note head width.  The quarter note is"
+              " followed by 3@tie{}NHW, the half by 4@tie{}NHW, etc.",
+
+              /* properties */
               "average-spacing-wishes "
               "base-shortest-duration "
               "common-shortest-duration "
               "average-spacing-wishes "
               "base-shortest-duration "
               "common-shortest-duration "
@@ -518,6 +538,5 @@ ADD_INTERFACE (Spacing_spanner,
               "strict-grace-spacing "
               "strict-note-spacing "
               "uniform-stretching "
               "strict-grace-spacing "
               "strict-note-spacing "
               "uniform-stretching "
-              
               );
 
               );