]> git.donarmstrong.com Git - lilypond.git/commitdiff
Caches full score pure minimum translations in align-interface implementing grobs.
authorMike Solomon <mike@apollinemike.com>
Wed, 9 Nov 2011 13:41:21 +0000 (14:41 +0100)
committerMike Solomon <mike@apollinemike.com>
Wed, 9 Nov 2011 13:41:21 +0000 (14:41 +0100)
lily/align-interface.cc
lily/include/align-interface.hh
lily/include/lily-guile.hh
lily/lily-guile.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 00ea0029e31717f0767efdb6c260f6ac799850d5..fb1ccf8a219df5742c7420de37dff780354533a6 100644 (file)
@@ -308,11 +308,25 @@ Align_interface::align_elements_to_minimum_distances (Grob *me, Axis a)
       all_grobs[j]->translate_axis (translates[j], a);
 }
 
+
+MAKE_SCHEME_CALLBACK (Align_interface, full_score_pure_minimum_translations, 1);
+SCM
+Align_interface::full_score_pure_minimum_translations (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  extract_grob_set (me, "elements", all_grobs);
+
+  vector<Real> pure_minimum_translations = Align_interface::get_pure_minimum_translations (me, all_grobs, Y_AXIS, 0, INT_MAX);
+  return ly_floatvector2scm (pure_minimum_translations);
+}
+
 Real
 Align_interface::get_pure_child_y_translation (Grob *me, Grob *ch, int start, int end)
 {
   extract_grob_set (me, "elements", all_grobs);
-  vector<Real> translates = get_pure_minimum_translations (me, all_grobs, Y_AXIS, start, end);
+  vector<Real> translates = start == 0 && end == INT_MAX
+                            ? ly_scm2floatvector (me->get_object ("full-score-pure-minimum-translations"))
+                            : get_pure_minimum_translations (me, all_grobs, Y_AXIS, start, end);
 
   if (translates.size ())
     {
@@ -369,6 +383,7 @@ ADD_INTERFACE (Align_interface,
                /* properties */
                "align-dir "
                "axes "
+               "full-score-pure-minimum-translations "
                "elements "
                "padding "
                "positioning-done "
index b7ef1d5f01e7ba6353fd128d29188842e1f3b705..f7b85f42aaba5b6bacf41d3eade7f24e2b360c74 100644 (file)
@@ -29,6 +29,7 @@ class Align_interface
 public:
   DECLARE_SCHEME_CALLBACK (align_to_minimum_distances, (SCM));
   DECLARE_SCHEME_CALLBACK (align_to_ideal_distances, (SCM));
+  DECLARE_SCHEME_CALLBACK (full_score_pure_minimum_translations, (SCM));
   static void align_elements_to_minimum_distances (Grob *, Axis a);
   static void align_elements_to_ideal_distances (Grob *);
   static vector<Real> get_minimum_translations (Grob *, vector<Grob *> const &, Axis a);
index 160729e9052e05df00910c2b0a44f3754252881a..c153aeb4dc66625bf23be8ef228aea9818dc8745 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <libguile.h>
 #include <string.h>
+#include <vector>
 
 /*
   Hack for various MacOS incarnations.
@@ -78,6 +79,8 @@ Interval robust_scm2interval (SCM, Drul_array<Real>);
 Offset robust_scm2offset (SCM, Offset);
 string robust_scm2string (SCM, string);
 Rational robust_scm2rational (SCM, Rational);
+vector<Real> ly_scm2floatvector (SCM);
+SCM ly_floatvector2scm (vector<Real> v);
 
 SCM ly_quote_scm (SCM s);
 bool type_check_assignment (SCM val, SCM sym, SCM type_symbol);
index 933bf271701959739cd5c9fcabbc8212e0a1ac0d..6aa40f78048eb12c71012e39efdae3f46019bf95 100644 (file)
@@ -527,6 +527,28 @@ robust_scm2double (SCM k, double x)
   return x;
 }
 
+vector<Real>
+ly_scm2floatvector (SCM l)
+{
+  vector<Real> floats;
+  for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
+    floats.push_back (robust_scm2double (scm_car (s), 0.0));
+  return floats;
+}
+
+SCM
+ly_floatvector2scm (vector<Real> v)
+{
+  SCM l = SCM_EOL;
+  SCM *tail = &l;
+  for (vsize i = 0; i < v.size (); i++)
+    {
+      *tail = scm_cons (scm_from_double (v[i]), SCM_EOL);
+      tail = SCM_CDRLOC (*tail);
+    }
+  return l;
+}
+
 string
 robust_scm2string (SCM k, string s)
 {
index b5acc268c3fde361fab017e63dac9daf5144883e..a6273dd3078bec4815054ba64d73c2c852d1e7cc 100644 (file)
@@ -1033,6 +1033,8 @@ in addition to notes and stems.")
      (figures ,ly:grob-array? "Figured bass objects for continuation line.")
      (flag ,ly:grob? "A pointer to a @code{Flag} object.")
      (footnote-stencil ,ly:stencil? "The stencil of a system's footnotes.")
+     (full-score-pure-minimum-translations ,list? "A list of translations
+for a full score's worth of grobs.")
 
      (glissando-index ,integer? "The index of a glissando in its note
 column.")
index 9e213c6daad1d7b52ea41877447230a7a13d186f..36340f4a26b170911bf0fd69323d24f6b454e657 100644 (file)
        (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)
+                (object-callbacks . ((full-score-pure-minimum-translations . ,ly:align-interface::full-score-pure-minimum-translations)
+                                     (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
                                      (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
                 (interfaces . (align-interface
                                axis-group-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 . ((full-score-pure-minimum-translations . ,ly:align-interface::full-score-pure-minimum-translations)
+                                     (Y-common . ,ly:axis-group-interface::calc-y-common)
                                      (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
                                      (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
                 (interfaces . (align-interface