]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/axis-group-interface.cc
Merge branch 'master' of ssh+git://hanwen@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / axis-group-interface.cc
index da08f53526eb4f1fa333df1126cd3ccdb77478c1..b589ff671ec52d8e34db78f10ce5196b1fc1866a 100644 (file)
@@ -90,6 +90,9 @@ Axis_group_interface::cached_pure_height (Grob *me, int start, int end)
 
   SCM extents = me->get_property ("adjacent-pure-heights");
 
+  if (!scm_is_vector (extents))
+    return Interval (0, 0);
+
   Interval ext;
   for (vsize i = 0; i + 1 < breaks.size (); i++)
     {
@@ -131,7 +134,8 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
          Item *it = dynamic_cast<Item*> (items[j]);
          int rank = it->get_column ()->get_rank ();
 
-         if (rank <= end && it->pure_is_visible (start, end))
+         if (rank <= end && it->pure_is_visible (start, end)
+             && !to_boolean (it->get_property ("cross-staff")))
            {
              Interval dims = items[j]->pure_height (common, start, end);
              if (!dims.is_empty ())
@@ -147,7 +151,8 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
       for (vsize j = 0; j < spanners.size (); j++)
        {
          Interval_t<int> rank_span = spanners[j]->spanned_rank_interval ();
-         if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start)
+         if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
+             && !to_boolean (spanners[j]->get_property ("cross-staff")))
            {
              Interval dims = spanners[j]->pure_height (common, start, end);
              if (!dims.is_empty ())
@@ -189,7 +194,8 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
 
       if (rank > end)
        break;
-      else if (rank >= start && it->pure_is_visible (start, end))
+      else if (rank >= start && it->pure_is_visible (start, end)
+              && !to_boolean (it->get_property ("cross-staff")))
        {
          Interval dims = it->pure_height (common, start, end);
          if (!dims.is_empty ())
@@ -200,7 +206,8 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
   for (vsize i = 0; i < spanners.size (); i++)
     {
       Interval_t<int> rank_span = spanners[i]->spanned_rank_interval ();
-      if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start)
+      if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
+         && !to_boolean (spanners[i]->get_property ("cross-staff")))
        {
          Interval dims = spanners[i]->pure_height (common, start, end);
          if (!dims.is_empty ())
@@ -279,8 +286,10 @@ Axis_group_interface::combine_skylines (SCM smob)
   Grob *me = unsmob_grob (smob);
   extract_grob_set (me, "elements", elements);
   Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS);
+  Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS);
 
-  assert (y_common == me);
+  if (y_common != me)
+    programming_error ("combining skylines that don't belong to me");
 
   Skyline_pair ret;
   for (vsize i = 0; i < elements.size (); i++)
@@ -291,6 +300,7 @@ Axis_group_interface::combine_skylines (SCM smob)
          Real offset = elements[i]->relative_coordinate (y_common, Y_AXIS);
          Skyline_pair other = *Skyline_pair::unsmob (skyline_scm);
          other.raise (offset);
+         other.shift (elements[i]->relative_coordinate (x_common, X_AXIS));
          ret.merge (other);
        }
     }
@@ -313,6 +323,22 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a)
   return ly_interval2scm (r - my_coord);
 }
 
+/* This is like generic_group_extent, but it only counts the grobs that
+   are children of some other axis-group. This is uncached; if it becomes
+   commonly used, it may be necessary to cache it somehow. */
+Interval
+Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staff, Axis parent_a)
+{
+  extract_grob_set (me, "elements", elts);
+  vector<Grob*> new_elts;
+
+  for (vsize i = 0; i < elts.size (); i++)
+    if (elts[i]->common_refpoint (staff, parent_a) == staff)
+      new_elts.push_back (elts[i]);
+
+  return relative_group_extent (new_elts, refp, ext_a);
+}
+
 
 Grob *
 Axis_group_interface::calc_pure_elts_and_common (Grob *me)
@@ -478,7 +504,7 @@ add_boxes (Grob *me, Grob *x_common, Grob *y_common, vector<Box> *const boxes, S
    positions, one for above the staff, one for below).
 
    In each pass, we loop through the unplaced grobs from left to right.
-   If the grob overlaps the right-most affected position, we place it
+   If the grob doesn't overlap the right-most affected position, we place it
    (and then update the right-most affected position to point to the right
    edge of the just-placed grob).  Otherwise, we skip it until the next pass.
 */
@@ -620,6 +646,7 @@ ADD_INTERFACE (Axis_group_interface,
               "elements "
               "keep-fixed-while-stretching "
               "max-stretch "
+              "no-alignment "
               "pure-Y-common "
               "pure-relevant-items "
               "pure-relevant-spanners "