]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/axis-group-interface.cc
Merge branch 'master' of ssh+git://git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / axis-group-interface.cc
index b9641d41c3ec735ebacdb447b5bcbc5beab3fc7c..8089d316f948ac0e25b5f834a5ca8f7d72d94a63 100644 (file)
@@ -90,11 +90,14 @@ 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++)
     {
       int r = Paper_column::get_rank (cols[breaks[i]]);
-      if (r > end)
+      if (r >= end)
        break;
 
       if (r >= start)
@@ -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 ())
@@ -256,13 +263,6 @@ Axis_group_interface::calc_skylines (SCM smob)
   extract_grob_set (me, "elements", elts);
   Skyline_pair skylines = skyline_spacing (me, elts);
 
-  /* add a minimum-Y-extent-sized box to the skyline */
-  SCM min_y_extent = me->get_property ("minimum-Y-extent");
-  if (is_number_pair (min_y_extent))
-    {
-      Box b (me->extent (me, X_AXIS), ly_scm2interval (min_y_extent));
-      skylines.insert (b, 0, X_AXIS);
-    }
   return skylines.smobbed_copy ();
 }
 
@@ -279,8 +279,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 +293,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 +316,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)
@@ -366,26 +385,33 @@ Axis_group_interface::calc_pure_elts_and_common (Grob *me)
   return common;
 }
 
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_x_common, 1);
 SCM
-Axis_group_interface::calc_x_common (SCM grob)
+Axis_group_interface::calc_common (Grob *me, Axis axis)
 {
-  Grob *me = unsmob_grob (grob);
-
   extract_grob_set (me, "elements", elts);
-  Grob *common = common_refpoint_of_array (elts, me, X_AXIS);
+  Grob *common = common_refpoint_of_array (elts, me, axis);
+  if (!common)
+    {
+      me->programming_error ("No common parent found in calc_common axis.");
+      return SCM_EOL;
+    }
+  
   return common->self_scm ();
 }
 
+
+MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_x_common, 1);
+SCM
+Axis_group_interface::calc_x_common (SCM grob)
+{
+  return calc_common (unsmob_grob (grob), X_AXIS);
+}
+
 MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_y_common, 1);
 SCM
 Axis_group_interface::calc_y_common (SCM grob)
 {
-  Grob *me = unsmob_grob (grob);
-
-  extract_grob_set (me, "elements", elts);
-  Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
-  return common->self_scm ();
+  return calc_common (unsmob_grob (grob), Y_AXIS);
 }
 
 Interval
@@ -609,7 +635,6 @@ Axis_group_interface::print (SCM smob)
 }
 
 ADD_INTERFACE (Axis_group_interface,
-
               "An object that groups other layout objects.",
 
               /* properties */
@@ -620,6 +645,7 @@ ADD_INTERFACE (Axis_group_interface,
               "elements "
               "keep-fixed-while-stretching "
               "max-stretch "
+              "no-alignment "
               "pure-Y-common "
               "pure-relevant-items "
               "pure-relevant-spanners "