]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-spanner.cc
* lily/beam.cc (least_squares): Add comment.
[lilypond.git] / lily / spacing-spanner.cc
index e69fac88a5e4917bf0597b53cbb1d26da9f1623c..4cd183f9e4bd5f085d7faa12dde996183a4e23fc 100644 (file)
@@ -10,7 +10,9 @@
 #include <math.h>
 #include <stdio.h>
 
+#include "main.hh"
 #include "system.hh"
+#include "warn.hh"
 #include "paper-def.hh"
 #include "paper-score.hh"
 #include "paper-column.hh"
@@ -26,9 +28,6 @@
 #include "break-align-interface.hh"
 #include "spacing-interface.hh"
 
-/*
-  paper-column:
- */
 class Spacing_spanner
 {
 public:
@@ -99,7 +98,7 @@ loose_column (Grob *l, Grob *c, Grob *r)
   if (!l_neighbor || !r_neighbor)
     return false;
 
-  l_neighbor = l_neighbor->column_l();
+  l_neighbor = l_neighbor->get_column ();
   r_neighbor = dynamic_cast<Item*> (Note_spacing::right_column  (r_neighbor));
 
   if (l == l_neighbor && r == r_neighbor)
@@ -239,7 +238,7 @@ Spacing_spanner::prune_loose_colunms (Grob*me,Link_array<Grob> *cols, Rational s
          while (flip (&d) != LEFT);
 
          Rod r;
-         r.distance_f_ = dists[LEFT] + dists[RIGHT];
+         r.distance_ = dists[LEFT] + dists[RIGHT];
          r.item_l_drul_[LEFT] = dynamic_cast<Item*> (cols->elem(i-1));
          r.item_l_drul_[RIGHT] = dynamic_cast<Item*> (cols->elem (i+1));
 
@@ -271,7 +270,7 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array<Grob> cols)
        {
          Item * wish = dynamic_cast<Item*> (unsmob_grob (gh_car (s)));
 
-         Item * lc = wish->column_l ();
+         Item * lc = wish->get_column ();
          Grob * right = Note_spacing::right_column (wish);
 
          if (!right)
@@ -279,8 +278,8 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array<Grob> cols)
 
          Item * rc = dynamic_cast<Item*> (right);
 
-         int right_rank = Paper_column::rank_i (rc);
-         int left_rank = Paper_column::rank_i (lc);      
+         int right_rank = Paper_column::get_rank (rc);
+         int left_rank = Paper_column::get_rank (lc);    
 
          /*
            update the left column.
@@ -303,7 +302,7 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array<Grob> cols)
              && unsmob_grob (gh_car (left_neighs)))
            {
              Item * it = dynamic_cast<Item*> (unsmob_grob (gh_car (left_neighs)));
-             maxrank = Paper_column::rank_i (it->column_l());
+             maxrank = Paper_column::get_rank (it->get_column ());
            }
 
          if (left_rank >= maxrank)
@@ -362,11 +361,24 @@ Spacing_spanner::set_springs (SCM smob)
 {
   Grob *me = unsmob_grob (smob);
 
-  Link_array<Grob> all (me->pscore_l_->line_l_->column_l_arr ()) ;
+  Link_array<Grob> all (me->pscore_->system_->columns ()) ;
 
   set_explicit_neighbor_columns (all);
 
-  Rational global_shortest = find_shortest (me, all);
+  SCM preset_shortest = me->get_grob_property ("common-shortest-duration");
+  Rational global_shortest;
+  if (unsmob_moment (preset_shortest))
+    {
+      global_shortest = unsmob_moment (preset_shortest)->main_part_;
+    }
+  else
+    {
+      global_shortest = find_shortest (me, all);
+      if (verbose_global_b)
+       {
+         progress_indication (_f("Global shortest duration is %s\n", global_shortest.string ())); 
+       }
+    }
   prune_loose_colunms (me, &all, global_shortest);
   set_implicit_neighbor_columns (all);
 
@@ -557,7 +569,7 @@ Spacing_spanner::musical_column_spacing (Grob *me, Item * lc, Item *rc, Real inc
 
       Item *wish_rcol = Note_spacing::right_column (wish);
       if (Note_spacing::left_column (wish) != lc
-         || (wish_rcol != rc && wish_rcol != rc->original_l_))
+         || (wish_rcol != rc && wish_rcol != rc->original_))
        continue;
 
       /*
@@ -580,7 +592,7 @@ Spacing_spanner::musical_column_spacing (Grob *me, Item * lc, Item *rc, Real inc
       max_fixed_note_space =  increment;
     }
 
-  bool ragged = to_boolean (me->paper_l ()->get_scmvar ("raggedright"));
+  bool ragged = to_boolean (me->get_paper ()->get_scmvar ("raggedright"));
 
   /*
     Whatever we do, the fixed space is smaller than the real
@@ -590,11 +602,27 @@ Spacing_spanner::musical_column_spacing (Grob *me, Item * lc, Item *rc, Real inc
     Maybe it should be continuous?
   */
   max_fixed_note_space = max_fixed_note_space <?  max_note_space;
-  
+#if 0
+  /*
+    This doesn't make sense. For ragged right we want to have the same
+    spacing. Otherwise  the option should be called differently.
+
+    ragged-righted-and-weird-spacing. Whatever.
+
+  */
   Real strength = (ragged) ? 1.0 : 1 / (max_note_space - max_fixed_note_space);
   Real distance = (ragged) ? max_fixed_note_space : max_note_space;
+#else
+
+  /*
+        TODO: make sure that the space doesn't exceed the right margin.
+   */
+  Real strength = 1 / (max_note_space - max_fixed_note_space);
+  Real distance = max_note_space;
+#endif
+
   //  Spaceable_grob::add_spring (lc, rc, distance, strength, expand_only);
-  
+
   Spaceable_grob::add_spring (lc, rc, distance, strength, false);  
 }
 
@@ -608,18 +636,25 @@ Spacing_spanner::standard_breakable_column_spacing (Grob * me, Item*l, Item*r,
                                   Real * fixed, Real * space,
                                   Moment shortest)
 {
   *fixed = 0.0;
   Direction d = LEFT;
   Drul_array<Item*> cols(l,r);
   
   do
     {
-      Interval lext = cols[d]->extent (cols [d], X_AXIS);
-
-      *fixed += -d * lext[-d];
+      if (!Paper_column::musical_b (cols[d]))
+       {
+         /*
+           Tied accidentals over barlines cause problems, so lets see
+           what happens if we do this for non musical columns only.
+          */
+         Interval lext = cols[d]->extent (cols [d], X_AXIS);
+         *fixed += -d * lext[-d];
+       }
     }
   while (flip (&d) != LEFT);
-  
+
   if (l->breakable_b (l) && r->breakable_b(r))
     {
       Moment *dt = unsmob_moment (l->get_grob_property ("measure-length"));
@@ -638,8 +673,6 @@ Spacing_spanner::standard_breakable_column_spacing (Grob * me, Item*l, Item*r,
 
       *space = *fixed + get_duration_space (me, dt, shortest.main_part_, &dummy);
     }
-  
-  
 }
 
 
@@ -671,7 +704,7 @@ Spacing_spanner::breakable_column_spacing (Grob*me, Item* l, Item *r,Moment shor
        pointer munging.
 
       */
-      assert (spacing_grob-> column_l () == l);
+      assert (spacing_grob-> get_column () == l);
 
       Staff_spacing::get_spacing_params (spacing_grob,
                                         &space, &fixed_space);  
@@ -716,7 +749,7 @@ Spacing_spanner::breakable_column_spacing (Grob*me, Item* l, Item *r,Moment shor
     works on all architectures.
    */
   
-  bool ragged = to_boolean (me->paper_l ()->get_scmvar ("raggedright"));
+  bool ragged = to_boolean (me->get_paper ()->get_scmvar ("raggedright"));
   Real strength = (ragged) ? 1.0 : 1 / (max_space - max_fixed);
   Real distance = (ragged) ? max_fixed : max_space;
   Spaceable_grob::add_spring (l, r, distance, strength, false);
@@ -751,8 +784,10 @@ Spacing_spanner::get_duration_space (Grob*me, Moment d, Rational shortest, bool
 
        */
       Rational ratio = d.main_part_ / shortest;
-      
+
+#if 0
       *expand_only = true;
+#endif
       return ((k-1) + double (ratio)) * incr;
     }
   else
@@ -783,7 +818,7 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
   
   if (! shortest_playing_len.to_bool ())
     {
-      programming_error ("can't find a ruling note at " + Paper_column::when_mom (lc).str ());
+      programming_error ("can't find a ruling note at " + Paper_column::when_mom (lc).string ());
       shortest_playing_len = 1;
     }
 
@@ -840,7 +875,7 @@ gets 2 note heads width (i.e. the space following a note is 1 note
 head width) A 16th note is followed by 0.5 note head width. The
 quarter note is followed by  3 NHW, the half by 4 NHW, etc.
 ",
-  "grace-space-factor spacing-increment base-shortest-duration shortest-duration-space");
+  "grace-space-factor spacing-increment base-shortest-duration shortest-duration-space common-shortest-duration");