]> git.donarmstrong.com Git - lilypond.git/commitdiff
Refactor pure-height calculations.
authorJoe Neeman <joeneeman@gmail.com>
Fri, 24 Sep 2010 22:33:11 +0000 (15:33 -0700)
committerJoe Neeman <joeneeman@gmail.com>
Tue, 28 Sep 2010 23:22:55 +0000 (16:22 -0700)
flower/include/interval.hh
flower/include/interval.tcc
lily/axis-group-interface.cc
lily/constrained-breaking.cc
lily/grob.cc
lily/include/grob.hh
lily/include/item.hh
lily/include/paper-score.hh
lily/item.cc
lily/paper-score.cc
scm/define-grobs.scm

index b3a799d07497f2a682957e39a6fbd17f69414ad7..4a08e278137a10be63df24f957943f389e265327 100644 (file)
@@ -72,6 +72,8 @@ struct Interval_t : public Drul_array<T>
   void set_empty ();
   void set_full ();
 
+  void unite_disjoint (Interval_t<T> h, T padding, Direction d);
+
   bool is_empty () const
   {
     return at (LEFT) > at (RIGHT);
index 5cd938fd0853fc14d9a68e85c7e8b9d2c4b2807b..7a1440a31986b55a6bff52cd7df734f0665da8b0 100644 (file)
@@ -107,6 +107,22 @@ Interval_t<T>::unite (Interval_t<T> h)
   at (RIGHT) = max (h.at (RIGHT), at (RIGHT));
 }
 
+/* Unites h and this interval, but in such a way
+   that h will lie in a particular direction from this
+   interval, with a minimum amount of space in between.
+   (That is, h will be translated before we unite, if
+   that is necessary to prevent overlap. */
+template<class T>
+void
+Interval_t<T>::unite_disjoint (Interval_t<T> h, T padding, Direction d)
+{
+  T dir = d;
+  T translation = dir * (at (d) + dir * padding - h.at (-d));
+  if (translation > (T) 0)
+    h.translate (translation);
+  unite (h);
+}
+
 template<class T>
 void
 Interval_t<T>::intersect (Interval_t<T> h)
index f4b652c6e2affb7e5bc0b7befa3e5a480dc97bae..b4003df2edb7764a008075cfc2ddab5f44496582 100644 (file)
@@ -35,6 +35,7 @@
 #include "system.hh"
 #include "warn.hh"
 
+
 void
 Axis_group_interface::add_element (Grob *me, Grob *e)
 {
@@ -140,6 +141,7 @@ Axis_group_interface::combine_pure_heights (Grob *me, SCM measure_extents, int s
   return ext;
 }
 
+
 // adjacent-pure-heights is a pair of vectors, each of which has one element
 // for every measure in the score. The first vector stores, for each measure,
 // the combined height of the elements that are present only when the bar
@@ -154,73 +156,62 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
   Grob *me = unsmob_grob (smob);
 
   Grob *common = unsmob_grob (me->get_object ("pure-Y-common"));
-  extract_grob_set (me, "pure-relevant-items", items);
-  extract_grob_set (me, "pure-relevant-spanners", spanners);
+  extract_grob_set (me, "pure-relevant-grobs", elts);
 
   Paper_score *ps = get_root_system (me)->paper_score ();
-  vector<vsize> breaks = ps->get_break_indices ();
-  vector<Grob*> cols = ps->get_columns ();
+  vector<vsize> ranks = ps->get_break_ranks ();
 
-  SCM begin_line_heights = scm_c_make_vector (breaks.size () - 1, SCM_EOL);
-  SCM mid_line_heights = scm_c_make_vector (breaks.size () - 1, SCM_EOL);
+  vector<Interval> begin_line_heights;
+  vector<Interval> mid_line_heights;
+  begin_line_heights.resize (ranks.size () - 1);
+  mid_line_heights.resize (ranks.size () - 1);
 
-  vsize it_index = 0;
-  for (vsize i = 0; i + 1 < breaks.size (); i++)
+  for (vsize i = 0; i < elts.size (); ++i)
     {
-      int start = Paper_column::get_rank (cols[breaks[i]]);
-      int end = Paper_column::get_rank (cols[breaks[i+1]]);
+      Grob *g = elts[i];
 
-      // Take grobs that are visible with respect to a slightly longer line.
-      // Otherwise, we will never include grobs at breakpoints which aren't
-      // end-of-line-visible.
-      int visibility_end = i + 2 < breaks.size () ?
-       Paper_column::get_rank (cols[breaks[i+2]]) : end;
+      if (to_boolean (g->get_property ("cross-staff")))
+       continue;
 
-      Interval begin_line_iv;
-      Interval mid_line_iv;
+      Interval_t<int> rank_span = g->spanned_rank_interval ();
+      vsize first_break = lower_bound (ranks, (vsize)rank_span[LEFT], less<vsize> ());
+      if (first_break > 0 && ranks[first_break] >= (vsize)rank_span[LEFT])
+       first_break--;
 
-      for (vsize j = it_index; j < items.size (); j++)
+      for (vsize j = first_break; j+1 < ranks.size () && (int)ranks[j] <= rank_span[RIGHT]; ++j)
        {
-         Item *it = dynamic_cast<Item*> (items[j]);
-         int rank = it->get_column ()->get_rank ();
+         int start = ranks[j];
+         int end = ranks[j+1];
 
-         if (rank <= end && it->pure_is_visible (start, visibility_end)
-             && !to_boolean (it->get_property ("cross-staff")))
-           {
-             Interval dims = items[j]->pure_height (common, start, end);
-             Interval &target_iv = start == it->get_column ()->get_rank () ? begin_line_iv : mid_line_iv;
-
-             if (!dims.is_empty ())
-               target_iv.unite (dims);
-           }
-
-         if (rank < end)
-           it_index++;
-         else if (rank > end)
-           break;
-       }
+         // Take grobs that are visible with respect to a slightly longer line.
+         // Otherwise, we will never include grobs at breakpoints which aren't
+         // end-of-line-visible.
+         int visibility_end = j + 2 < ranks.size () ? ranks[j+2] : end;
 
-      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
-             && !to_boolean (spanners[j]->get_property ("cross-staff")))
+         if (g->pure_is_visible (start, visibility_end))
            {
-             Interval dims = spanners[j]->pure_height (common, start, end);
-
+             Interval dims = g->pure_height (common, start, end);
              if (!dims.is_empty ())
                {
-                 mid_line_iv.unite (dims);
                  if (rank_span[LEFT] <= start)
-                   begin_line_iv.unite (dims);
+                   begin_line_heights[j].unite (dims);
+                 if (rank_span[RIGHT] > start)
+                   mid_line_heights[j].unite (dims);
                }
            }
        }
+    }
 
-      scm_vector_set_x (begin_line_heights, scm_from_int (i), ly_interval2scm (begin_line_iv));
-      scm_vector_set_x (mid_line_heights, scm_from_int (i), ly_interval2scm (mid_line_iv));
+  // Convert begin_line_heights and min_line_heights to SCM.
+  SCM begin_scm = scm_c_make_vector (ranks.size () - 1, SCM_EOL);
+  SCM mid_scm = scm_c_make_vector (ranks.size () - 1, SCM_EOL);
+  for (vsize i = 0; i < begin_line_heights.size (); ++i)
+    {
+      scm_vector_set_x (begin_scm, scm_from_int (i), ly_interval2scm (begin_line_heights[i]));
+      scm_vector_set_x (mid_scm, scm_from_int (i), ly_interval2scm (mid_line_heights[i]));
     }
-  return scm_cons (begin_line_heights, mid_line_heights);
+
+  return scm_cons (begin_scm, mid_scm);
 }
 
 Interval
@@ -231,8 +222,7 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
      Unfortunately, it isn't always true, particularly if there is a
      VerticalAlignment somewhere in the descendants.
 
-     Apart from PianoStaff, which has a fixed VerticalAlignment so it doesn't
-     count, the only VerticalAlignment comes from Score. This makes it
+     Usually, the only VerticalAlignment comes from Score. This makes it
      reasonably safe to assume that if our parent is a VerticalAlignment,
      we can assume additivity and cache things nicely. */
   Grob *p = me->get_parent (Y_AXIS);
@@ -240,34 +230,18 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
     return Axis_group_interface::cached_pure_height (me, start, end);
 
   Grob *common = unsmob_grob (me->get_object ("pure-Y-common"));
-  extract_grob_set (me, "pure-relevant-items", items);
-  extract_grob_set (me, "pure-relevant-spanners", spanners);
+  extract_grob_set (me, "pure-relevant-grobs", elts);
 
   Interval r;
-
-  for (vsize i = 0; i < items.size (); i++)
-    {
-      Item *it = dynamic_cast<Item*> (items[i]);
-      int rank = it->get_column ()->get_rank ();
-
-      if (rank > end)
-       break;
-      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 ())
-           r.unite (dims);
-       }
-    }
-
-  for (vsize i = 0; i < spanners.size (); i++)
+  for (vsize i = 0; i < elts.size (); i++)
     {
-      Interval_t<int> rank_span = spanners[i]->spanned_rank_interval ();
+      Grob *g = elts[i];
+      Interval_t<int> rank_span = g->spanned_rank_interval ();
       if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
-         && !to_boolean (spanners[i]->get_property ("cross-staff")))
+         && g->pure_is_visible (start, end)
+         && !to_boolean (g->get_property ("cross-staff")))
        {
-         Interval dims = spanners[i]->pure_height (common, start, end);
+         Interval dims = g->pure_height (common, start, end);
          if (!dims.is_empty ())
            r.unite (dims);
        }
@@ -426,44 +400,6 @@ Axis_group_interface::calc_pure_relevant_grobs (SCM smob)
   return grobs_scm;
 }
 
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_items, 1);
-SCM
-Axis_group_interface::calc_pure_relevant_items (SCM smob)
-{
-  Grob *me = unsmob_grob (smob);
-
-  extract_grob_set (me, "pure-relevant-grobs", elts);
-
-  vector<Grob*> relevant_items;
-  for (vsize i = 0; i < elts.size (); i++)
-    if (Item *it = dynamic_cast<Item*> (elts[i]))
-      relevant_items.push_back (it);
-
-  vector_sort (relevant_items, Item::less);
-
-  SCM items_scm = Grob_array::make_array ();
-  unsmob_grob_array (items_scm)->set_array (relevant_items);
-  return items_scm;
-}
-
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_spanners, 1);
-SCM
-Axis_group_interface::calc_pure_relevant_spanners (SCM smob)
-{
-  Grob *me = unsmob_grob (smob);
-
-  extract_grob_set (me, "pure-relevant-grobs", elts);
-
-  vector<Grob*> relevant_spanners;
-  for (vsize i = 0; i < elts.size (); i++)
-    if (dynamic_cast<Spanner*> (elts[i]))
-      relevant_spanners.push_back (elts[i]);
-
-  SCM spanners_scm = Grob_array::make_array ();
-  unsmob_grob_array (spanners_scm)->set_array (relevant_spanners);
-  return spanners_scm;
-}
-
 MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_y_common, 1);
 SCM
 Axis_group_interface::calc_pure_y_common (SCM smob)
@@ -542,7 +478,7 @@ Axis_group_interface::get_children (Grob *me, vector<Grob*> *found)
     }
 }
 
-bool
+static bool
 staff_priority_less (Grob * const &g1, Grob * const &g2)
 {
   Real priority_1 = robust_scm2double (g1->get_property ("outside-staff-priority"), -infinity_f);
index a7fac5a30d4146f1d9f868146524e077e6aa7241..eda697e56bad80e7ee9c14ffe6a30453445ce13e 100644 (file)
@@ -432,7 +432,7 @@ Constrained_breaking::initialize ()
   Interval first_line = line_dimensions_int (pscore_->layout (), 0);
   Interval other_lines = line_dimensions_int (pscore_->layout (), 1);
   /* do all the rod/spring problems */
-  breaks_ = pscore_->find_break_indices ();
+  breaks_ = pscore_->get_break_indices ();
   all_ = pscore_->root_system ()->used_columns ();
   lines_.resize (breaks_.size (), breaks_.size (), Line_details ());
   vector<Real> forces = get_line_forces (all_,
index 5047b35be0c0c337d45bddf338fdc49f7a5f0384..882808180c6f2509cd7c807b5d22fed795f8239e 100644 (file)
@@ -482,6 +482,19 @@ Grob::spanned_rank_interval () const
   return Interval_t<int> (-1, 0);
 }
 
+bool
+Grob::pure_is_visible (int start, int end) const
+{
+  return true;
+}
+
+/* Sort grobs according to their starting column. */
+bool
+Grob::less (Grob *g1, Grob *g2)
+{
+  return g1->spanned_rank_interval ()[LEFT] < g2->spanned_rank_interval ()[LEFT];
+}
+
 /****************************************************************
   REFPOINTS
 ****************************************************************/
index 3d211964a49a7fae830e0bef1c57d0b4a3e5ad73..96134a05d5eafe42ab3c5135669237df64409cfb 100644 (file)
@@ -141,7 +141,9 @@ public:
   void fixup_refpoint ();
 
   virtual Interval_t<int> spanned_rank_interval () const;
+  virtual bool pure_is_visible (int start, int end) const;
   bool check_cross_staff (Grob *common);
+  static bool less (Grob *g1, Grob *g2);
 };
 
 /* smob utilities */
index 8f5dd180f09e2fea4a725206114e6d2c47249272..e80d1f8fd476e354db08bc9323fffee92d767242 100644 (file)
@@ -40,9 +40,8 @@ public:
 
   static bool is_non_musical (Grob *);
   static bool break_visible(Grob *);
-  static bool less (Grob * const&, Grob * const&);
   bool is_broken () const;
-  bool pure_is_visible (int start, int end) const;
+  virtual bool pure_is_visible (int start, int end) const;
 
   Direction break_status_dir () const;
 
index 2b98fbbbf4fdef66339137963ba59797f7179af1..e8309be265bec365c5f822311442c401a74e0dd7 100644 (file)
@@ -33,6 +33,7 @@ class Paper_score : public Music_output
 
   mutable vector<Grob*> cols_;
   mutable vector<vsize> break_indices_;
+  mutable vector<vsize> break_ranks_;
 public:
   Paper_score (Output_def *);
   
@@ -43,11 +44,12 @@ public:
 
   void typeset_system (System *);
   vector<Column_x_positions> calc_breaking ();
-  vector<vsize> find_break_indices () const;
   vector<vsize> get_break_indices () const;
+  vector<vsize> get_break_ranks () const;
   vector<Grob*> get_columns () const;
   SCM get_paper_systems ();
 protected:
+  void find_break_indices () const;
   virtual void process ();
   virtual void derived_mark () const;
 
index 0f188ce59e0d9478a350fa36b5852d2d39698053..f503d98c48454905053f591c269509685662cfe4 100644 (file)
@@ -253,12 +253,6 @@ Item::pure_height (Grob *g, int start, int end)
   return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
 }
 
-bool
-Item::less (Grob * const &g1, Grob * const &g2)
-{
-  return dynamic_cast<Item*> (g1)->get_column ()->get_rank () < dynamic_cast<Item*> (g2)->get_column ()->get_rank ();
-}
-
 ADD_INTERFACE (Item,
               "Grobs can be distinguished in their role in the horizontal"
               " spacing.  Many grobs define constraints on the spacing by"
index 4c2719a91fbdb512dfba0d3c5c21e2c50956c5c7..611af4125c353adb203479ed80971bbdf00fcce2 100644 (file)
@@ -69,26 +69,24 @@ Paper_score::typeset_system (System *system)
   system->unprotect ();
 }
 
-
-vector<vsize>
+void
 Paper_score::find_break_indices () const
 {
-  vector<Grob*> all = root_system ()->used_columns ();
-  vector<vsize> retval;
+  cols_ = root_system ()->used_columns ();
+  break_indices_.clear ();
+  break_ranks_.clear ();
 
-  for (vsize i = 0; i < all.size (); i++)
+  for (vsize i = 0; i < cols_.size (); i++)
     {
-      Item *it = dynamic_cast<Item*> (all[i]);
-      if (Paper_column::is_breakable (all[i])
+      Item *it = dynamic_cast<Item*> (cols_[i]);
+      if (Paper_column::is_breakable (cols_[i])
          && (i == 0 || it->find_prebroken_piece (LEFT))
-         && (i == all.size () - 1 || it->find_prebroken_piece (RIGHT)))
-       retval.push_back (i);
+         && (i == cols_.size () - 1 || it->find_prebroken_piece (RIGHT)))
+       {
+         break_indices_.push_back (i);
+         break_ranks_.push_back (it->get_column ()->get_rank ());
+       }
     }
-
-  cols_ = all;
-  break_indices_ = retval;
-
-  return retval;
 }
 
 vector<vsize>
@@ -107,6 +105,14 @@ Paper_score::get_columns () const
   return cols_;
 }
 
+vector<vsize>
+Paper_score::get_break_ranks () const
+{
+  if (break_ranks_.empty ())
+    find_break_indices ();
+  return break_ranks_;
+}
+
 vector<Column_x_positions>
 Paper_score::calc_breaking ()
 {
index 4eeb3812c7c98ae62ce2e9b8621deeca595abc99..3d2af32d47b501d64731c7ed6d960b13646732d6 100644 (file)
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Item)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (ambitus-interface
                                axis-group-interface
                                break-aligned-interface))))))
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (align-interface
                                axis-group-interface
                                bass-figure-alignment-interface))))))
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                side-position-interface))))))
 
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface))))))
 
 
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                dynamic-interface
                                dynamic-line-spanner-interface
        (X-extent . ,ly:axis-group-interface::width)
        (meta . ((class . Paper_column)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                font-interface
                                paper-column-interface
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Item)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                note-collision-interface))))))
 
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Item)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                note-column-interface
                                separation-item-interface))))))
        ;;                       (font-size . -6) (font-name . "sans") (Y-extent . #f)
        (meta . ((class . Paper_column)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                font-interface
                                paper-column-interface
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Item)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (bar-line-interface
                                font-interface
                                span-bar-interface))))))
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
        (Y-extent . ,ly:system::height)
        (meta . ((class . System)
                 (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
                                      (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
                 (interfaces . (axis-group-interface
                                system-interface))))))
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
        (meta . ((class . Spanner)
                 (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)
                                      (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
                                      (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
                 (interfaces . (align-interface
                                axis-group-interface))))))
                 (object-callbacks . (
                                      (X-common . ,ly:axis-group-interface::calc-x-common)
                                      (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
 
                 (interfaces . (axis-group-interface
                                hara-kiri-group-spanner-interface))))))
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (meta . ((class . Spanner)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
-                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
-                                     (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
-                                     (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+                                     (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (axis-group-interface
                                side-position-interface
                                volta-interface))))))