]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/axis-group-interface.cc
add horizon_padding to skylines (although it is currently always 0)
[lilypond.git] / lily / axis-group-interface.cc
index 2821c38466fef9219c50b998f89a30c8a61d463a..44293f6d5455c75ed497676dbf809d0238521f79 100644 (file)
 #include "align-interface.hh"
 #include "directional-element-interface.hh"
 #include "pointer-group-interface.hh"
-#include "grob.hh"
 #include "grob-array.hh"
 #include "hara-kiri-group-spanner.hh"
 #include "international.hh"
-#include "item.hh"
 #include "paper-column.hh"
 #include "paper-score.hh"
-#include "std-vector.hh"
 #include "system.hh"
 #include "warn.hh"
 
@@ -90,6 +87,8 @@ Axis_group_interface::cached_pure_height (Grob *me,
       if (end == r)
        end_index = i;
     }
+  if (end == INT_MAX)
+    end_index = breaks.size () - 1;
 
   if (start_index == VPOS || end_index == VPOS)
     {
@@ -184,7 +183,7 @@ SCM
 Axis_group_interface::generic_group_extent (Grob *me, Axis a)
 {
   extract_grob_set (me, "elements", elts);
-  if (a == Y_AXIS)
+  if (a == Y_AXIS && to_boolean (me->get_property ("skyline-spacing")))
     skyline_spacing (me, elts);
   Grob *common = common_refpoint_of_array (elts, me, a);
 
@@ -272,6 +271,22 @@ staff_priority_less (Grob * const &g1, Grob * const &g2)
   return rank_1 < rank_2;
 }
 
+static void
+add_boxes (Grob *me, Grob *x_common, Grob *y_common, vector<Box> *const boxes)
+{
+  if (Axis_group_interface::has_interface (me)
+      && Axis_group_interface::has_axis (me, Y_AXIS))
+    {
+      Grob_array *elements = unsmob_grob_array (me->get_object ("elements"));
+      if (elements)
+       for (vsize i = 0; i < elements->size (); i++)
+         add_boxes (elements->grob (i), x_common, y_common, boxes);
+    }
+  else
+    boxes->push_back (Box (me->extent (x_common, X_AXIS),
+                          me->extent (y_common, Y_AXIS)));
+}
+
 void
 Axis_group_interface::skyline_spacing (Grob *me, vector<Grob*> elements)
 {
@@ -281,13 +296,13 @@ Axis_group_interface::skyline_spacing (Grob *me, vector<Grob*> elements)
 
   vsize i = 0;
   vector<Box> boxes;
+
   for (i = 0; i < elements.size ()
-        && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++)
-    boxes.push_back (Box (elements[i]->extent (x_common, X_AXIS),
-                         elements[i]->extent (y_common, Y_AXIS)));
+        && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++)
+    add_boxes (elements[i], x_common, y_common, &boxes);
 
-  Drul_array<Skyline> skylines (Skyline (boxes, X_AXIS, DOWN),
-                               Skyline (boxes, X_AXIS, UP));
+  Drul_array<Skyline> skylines (Skyline (boxes, 0, X_AXIS, DOWN),
+                               Skyline (boxes, 0, X_AXIS, UP));
   for (; i < elements.size (); i++)
     {
       Direction dir = get_grob_direction (elements[i]);
@@ -299,21 +314,28 @@ Axis_group_interface::skyline_spacing (Grob *me, vector<Grob*> elements)
 
       Box b (elements[i]->extent (x_common, X_AXIS),
             elements[i]->extent (y_common, Y_AXIS));
+      if (b[X_AXIS].is_empty () || b[Y_AXIS].is_empty ())
+       {
+         warning (_f ("outside-staff object %s has an empty extent", elements[i]->name ().c_str ()));
+         continue;
+       }
+
       boxes.clear ();
       boxes.push_back (b);
-      Skyline other = Skyline (boxes, X_AXIS, -dir);
-      Real dist = skylines[dir].distance (other);
+      Skyline other = Skyline (boxes, 0, X_AXIS, -dir);
+      Real padding = robust_scm2double (elements[i]->get_property ("outside-staff-padding"), 0.5);
+      Real dist = skylines[dir].distance (other) + padding;
 
       if (dist > 0)
        {
          b.translate (Offset (0, dir*dist));
          elements[i]->translate_axis (dir*dist, Y_AXIS);
        }
-      skylines[dir].insert (b, X_AXIS);
+      skylines[dir].insert (b, 0, X_AXIS);
     }
 }
 
-ADD_INTERFACE (Axis_group_interface, "axis-group-interface",
+ADD_INTERFACE (Axis_group_interface,
 
               "An object that groups other layout objects.",
 
@@ -322,5 +344,6 @@ ADD_INTERFACE (Axis_group_interface, "axis-group-interface",
               "elements "
               "common-refpoint-of-elements "
               "pure-relevant-elements "
+              "skyline-spacing "
               "cached-pure-extents "
               );