]> git.donarmstrong.com Git - lilypond.git/commitdiff
Use object callbacks for pure-height caching.
authorJoe Neeman <joeneeman@gmail.com>
Sun, 27 Jun 2010 18:53:32 +0000 (21:53 +0300)
committerJoe Neeman <joeneeman@gmail.com>
Tue, 29 Jun 2010 22:17:27 +0000 (01:17 +0300)
lily/axis-group-interface.cc
lily/include/axis-group-interface.hh
lily/span-bar.cc
lily/system.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 262f387ada4aa4e671b6c987a464d9a902c65b6e..578549a3d4abc10cfd2027708167b58bdfcbb3c2 100644 (file)
@@ -153,7 +153,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
 {
   Grob *me = unsmob_grob (smob);
 
-  Grob *common = calc_pure_elts_and_common (me);
+  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);
 
@@ -169,6 +169,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
     {
       int start = Paper_column::get_rank (cols[breaks[i]]);
       int end = Paper_column::get_rank (cols[breaks[i+1]]);
+
       Interval begin_line_iv;
       Interval mid_line_iv;
 
@@ -228,7 +229,7 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
   if (p && Align_interface::has_interface (p))
     return Axis_group_interface::cached_pure_height (me, start, end);
 
-  Grob *common = calc_pure_elts_and_common (me);
+  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);
 
@@ -380,56 +381,94 @@ Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staf
 }
 
 
-Grob *
-Axis_group_interface::calc_pure_elts_and_common (Grob *me)
+MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_grobs, 1);
+SCM
+Axis_group_interface::calc_pure_relevant_grobs (SCM smob)
 {
-  if (Grob *c = unsmob_grob (me->get_object ("pure-Y-common")))
-    return c;
+  Grob *me = unsmob_grob (smob);
   
   extract_grob_set (me, "elements", elts);
 
-  vector<Grob*> relevant_items;
-  vector<Grob*> relevant_spanners;
+  vector<Grob*> relevant_grobs;
   SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?");
 
   for (vsize i = 0; i < elts.size (); i++)
     {
       if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL)))
+       relevant_grobs.push_back (elts[i]);
+
+      if (Item *it = dynamic_cast<Item*> (elts[i]))
        {
-         if (dynamic_cast<Item*> (elts[i]))
-           relevant_items.push_back (elts[i]);
-         else if (dynamic_cast<Spanner*> (elts[i]))
-           relevant_spanners.push_back (elts[i]);
+         Direction d = LEFT;
+         do
+           {
+             Item *piece = it->find_prebroken_piece (d);
+             if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->self_scm (), SCM_EOL)))
+               relevant_grobs.push_back (piece);
+           }
+         while (flip (&d) != LEFT);
        }
-           
-
-      Item *it = dynamic_cast<Item*> (elts[i]);
-      Direction d = LEFT;
-      if (it)
-       do
-         {
-           Item *piece = it->find_prebroken_piece (d);
-           if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->self_scm (), SCM_EOL)))
-             relevant_items.push_back (piece);
-         }
-       while (flip (&d) != LEFT);
     }
-  vector_sort (relevant_items, Item::less);
 
-  Grob *common = common_refpoint_of_array (relevant_items, me, Y_AXIS);
-  common = common_refpoint_of_array (relevant_spanners, common, Y_AXIS);
+  SCM grobs_scm = Grob_array::make_array ();
+  unsmob_grob_array (grobs_scm)->set_array (relevant_grobs);
 
-  me->set_object ("pure-Y-common", common->self_scm ());
-  
-  SCM items_scm = Grob_array::make_array ();
-  SCM spanners_scm = Grob_array::make_array ();
+  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);
-  me->set_object ("pure-relevant-items", items_scm);
-  me->set_object ("pure-relevant-spanners", spanners_scm);
+  return spanners_scm;
+}
+
+MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_y_common, 1);
+SCM
+Axis_group_interface::calc_pure_y_common (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
 
-  return common;
+  extract_grob_set (me, "pure-relevant-grobs", elts);
+  Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
+  if (!common)
+    {
+      me->programming_error ("No common parent found in calc_pure_y_common.");
+      return SCM_EOL;
+    }
+
+  return common->self_scm ();
 }
 
 SCM
@@ -442,7 +481,7 @@ Axis_group_interface::calc_common (Grob *me, Axis axis)
       me->programming_error ("No common parent found in calc_common axis.");
       return SCM_EOL;
     }
-  
+
   return common->self_scm ();
 }
 
@@ -464,8 +503,13 @@ Axis_group_interface::calc_y_common (SCM grob)
 Interval
 Axis_group_interface::pure_group_height (Grob *me, int start, int end)
 {
-  Grob *common = calc_pure_elts_and_common (me);
-       
+  Grob *common = unsmob_grob (me->get_object ("pure-Y-common"));
+
+  if (!common)
+    {
+      programming_error ("no pure Y common refpoint");
+      return Interval ();
+    }
   Real my_coord = me->relative_coordinate (common, Y_AXIS);
   Interval r (relative_pure_height (me, start, end));
 
@@ -762,6 +806,7 @@ ADD_INTERFACE (Axis_group_interface,
               "next-staff-spacing "
               "no-alignment "
               "pure-Y-common "
+              "pure-relevant-grobs "
               "pure-relevant-items "
               "pure-relevant-spanners "
               "staff-affinity "
index bfe7b8100dc5a72b21fd00daecd1e2941d4ffd6b..bd038c7d105f92cfa62526144011e27005a8688b 100644 (file)
@@ -40,6 +40,10 @@ struct Axis_group_interface
   DECLARE_SCHEME_CALLBACK (adjacent_pure_heights, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_next_staff_spacing, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_pure_next_staff_spacing, (SCM, SCM, SCM));
+  DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_pure_relevant_items, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_pure_relevant_spanners, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_pure_y_common, (SCM));
   static Interval relative_group_extent (vector<Grob*> const &list,
                                         Grob *common, Axis);
   static Interval relative_pure_height (Grob *me, int start, int end);
@@ -48,7 +52,6 @@ struct Axis_group_interface
   static Interval begin_of_line_pure_height (Grob *me, int);
   static Interval rest_of_line_pure_height (Grob *me, int, int);
 
-  static Grob *calc_pure_elts_and_common (Grob*);
   static Skyline_pair skyline_spacing (Grob *me, vector<Grob*> elements);
   static void add_element (Grob *me, Grob *);
   static void set_axes (Grob *, Axis, Axis);
index 36590c30a598fb1c6c4188c3bc46bc83749ca0c5..897acf0b31f4e0251e37b76069c5be12504e2202 100644 (file)
@@ -244,5 +244,9 @@ ADD_INTERFACE (Span_bar,
               /* properties */
               "glyph-name "
               "elements "
+              "pure-Y-common "
+              "pure-relevant-grobs "
+              "pure-relevant-items "
+              "pure-relevant-spanners "
               );
 
index f938b8322e744377ef68488ee137fd64e521b09f..e440bed35ed12e8ae97c5efe5e21cd8c2ef6b2e6 100644 (file)
@@ -592,6 +592,7 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin)
         iv.translate (offsets[i]);
       ret.unite (iv);
     }
+
   return ret;
 }
 
index 1ab45629ff0ab0fa2776d7ddd5a52291be7901b4..f66884edd047b54920b9e5f7921daf4669661993 100644 (file)
@@ -951,6 +951,8 @@ for this column.")
      (note-heads ,ly:grob-array? "An array of note head grobs.")
      (pedal-text ,ly:grob? "A pointer to the text of a mixed-style piano
 pedal.")
+     (pure-relevant-grobs ,ly:grob-array? "All the grobs (items and spanners)
+that are relevant for finding the @code{pure-Y-extent}")
      (pure-relevant-items ,ly:grob-array? "A subset of elements that are
 relevant for finding the @code{pure-Y-extent}.")
      (pure-relevant-spanners ,ly:grob-array? "A subset of elements that are
index a76dd3165582fdb28763dfc450982464cd90e361..8ae81d7f65d2100100a949be25d03e573f2bb968 100644 (file)
        (X-extent . ,ly:axis-group-interface::width)
        (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)))
                 (interfaces . (ambitus-interface
                                axis-group-interface
                                break-aligned-interface))))))
        (stacking-dir . ,DOWN)
        (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)))
                 (interfaces . (align-interface
                                axis-group-interface
                                bass-figure-alignment-interface))))))
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (interfaces . (axis-group-interface
                                side-position-interface))))))
 
        (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
        (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)))
                 (interfaces . (axis-group-interface))))))
 
 
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (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)))
                 (interfaces . (axis-group-interface
                                font-interface
                                paper-column-interface
        (X-extent . ,ly:axis-group-interface::width)
        (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)))
                 (interfaces . (axis-group-interface
                                note-collision-interface))))))
 
        (X-extent . ,ly:axis-group-interface::width)
        (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)))
                 (interfaces . (axis-group-interface
                                note-column-interface
                                separation-item-interface))))))
        ;; debugging
        ;;                       (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)))
                 (interfaces . (axis-group-interface
                                font-interface
                                paper-column-interface
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
        (X-extent . ,ly:span-bar::width)
        (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)))
                 (interfaces . (bar-line-interface
                                font-interface
                                span-bar-interface))))))
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
 
     (System
      . (
+       (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
        (axes . (,X ,Y))
        (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
        (X-extent . ,ly:axis-group-interface::width)
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . System)
+                (object-callbacks . ((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 . (axis-group-interface
                                system-interface))))))
 
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (interfaces . (axis-group-interface
                                piano-pedal-interface
                                side-position-interface))))))
        (X-extent . ,ly:axis-group-interface::width)
        (Y-extent . ,ly:axis-group-interface::height)
        (meta . ((class . Spanner)
-                (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)))
+                (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))))))
 
        (Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
        (Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
        (meta . ((class . Spanner)
-                (object-callbacks . ((X-common . ,ly:axis-group-interface::calc-x-common)))
+                (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)))
+
                 (interfaces . (axis-group-interface
                                hara-kiri-group-spanner-interface
                                vertically-spaceable-interface))))))
        (Y-extent . ,ly:axis-group-interface::height)
        (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)))
                 (interfaces . (axis-group-interface
                                side-position-interface
                                volta-interface))))))