]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-spacing.cc
Fix potential NULL dereference in Staff_symbol::on_line().
[lilypond.git] / lily / staff-spacing.cc
index 2b1368137620a890f264340d7f772d6bf24c224f..801fb96948e66fdc78c66750519d3f986928781f 100644 (file)
@@ -108,34 +108,21 @@ Staff_spacing::next_notes_correction (Grob *me,
 }
 
 /* We calculate three things here: the ideal distance, the minimum distance
-   (which is the distance at which collisions will occure) and the "fixed"
+   (which is the distance at which collisions will occur) and the "fixed"
    distance, which is the distance at which things start to look really bad.
    We arrange things so that the fixed distance will be attained when the
    line is compressed with a force of 1.0 */
 Spring
 Staff_spacing::get_spacing (Grob *me, Grob *right_col)
 {
-  Grob *separation_item = 0;
   Item *me_item = dynamic_cast<Item *> (me);
-
-  extract_grob_set (me, "left-items", items);
-  for (vsize i = items.size (); i--;)
-    {
-      Grob *cand = items[i];
-      if (cand && Separation_item::has_interface (cand))
-       separation_item = cand;
-    }
-
-  //  printf ("doing col %d\n" , Paper_column::get_rank (left_col));
-  if (!separation_item)
-    {
-      programming_error ("no sep item");
-      return Spring ();
-    }
+  Grob *left_col = me_item->get_column ();
 
   Interval last_ext;
-  Grob *last_grob = Separation_item::extremal_break_aligned_grob (separation_item, RIGHT,
-                                                                 &last_ext);
+  Direction break_dir = me_item->break_status_dir ();
+  Grob *last_grob = Spacing_interface::extremal_break_aligned_grob (me, LEFT,
+                                                                   break_dir,
+                                                                   &last_ext);
   if (!last_grob)
     {
       /*
@@ -197,7 +184,7 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
       ideal = fixed;
     }
 
-  Grob *left_col = dynamic_cast<Item*> (me)->get_column ();
+
   Real optical_correction = next_notes_correction (me, last_grob);
   Real min_dist = Paper_column::minimum_distance (left_col, right_col);
 
@@ -209,14 +196,14 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
   ideal += correction;
 
   Spring ret (ideal, min_dist);
-  ret.set_inverse_stretch_strength (ideal - fixed);
+  ret.set_inverse_stretch_strength (max (0.0, ideal - fixed));
   return ret;
 }
 
 ADD_INTERFACE (Staff_spacing,
-              "This object calculates spacing details from a "
-              " breakable symbol (left) to another object. For example, it takes care "
-              " of  optical spacing from  a bar lines to a note.",
+              "This object calculates spacing details from a breakable"
+              " symbol (left) to another object.  For example, it takes care"
+              " of optical spacing from a bar line to a note.",
 
               /* properties */
               "stem-spacing-correction "