lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Caches pure translations for full score. (issue 5349043)


From: mtsolo
Subject: Caches pure translations for full score. (issue 5349043)
Date: Sat, 05 Nov 2011 12:37:28 +0000

Reviewers: ,

Message:
Hey all,

A small patch to speed up LilyPond for large scores.  Some benchmarks:

\version "2.15.17"
foo = \relative c'' {
  \repeat unfold 1200 {
    <a b cis e>8-.^"foo"\pp^\espressivo\glissando[
    ( <a b cis e>-.^"foo"\p^\espressivo )]
  }
}

<<
\new Staff \foo


CURRENT MASTER
real    0m36.986s
user 0m33.366s

WITH PATCH
real    0m36.393s
user 0m32.262s

\version "2.15.17"
foo = \relative c'' {
  \repeat unfold 1200 {
    <a b cis e>8-.^"foo"\pp^\espressivo\glissando[
    ( <a b cis e>-.^"foo"\p^\espressivo )]
  }
}

<<
\new Staff \foo
\new Staff \foo
\new Staff \foo
\new Staff \foo
\new Staff \foo
\new Staff \foo


CURRENT MASTER
real    5m29.722s
user 5m17.332s
sys 0m4.544s

WITH PATCH
real    3m30.123s
user 3m21.257s


Description:
Caches pure translations for full score.

Please review this at http://codereview.appspot.com/5349043/

Affected files:
  M lily/align-interface.cc
  M lily/include/align-interface.hh
  M scm/define-grob-properties.scm
  M scm/define-grobs.scm


Index: lily/align-interface.cc
diff --git a/lily/align-interface.cc b/lily/align-interface.cc
index 00ea0029e31717f0767efdb6c260f6ac799850d5..d864bb9f0354aba61000dafeabc91f38d0903a65 100644
--- a/lily/align-interface.cc
+++ b/lily/align-interface.cc
@@ -308,11 +308,41 @@ 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);
+  SCM l = SCM_EOL;
+  SCM *tail = &l;
+  for (vsize i = 0; i < pure_minimum_translations.size (); i++)
+    {
+ *tail = scm_cons (scm_from_double (pure_minimum_translations[i]), SCM_EOL);
+      tail = SCM_CDRLOC (*tail);
+    }
+  return l;
+}
+
+vector<Real>
+float_list_to_vector (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;
+}
+
 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
+ ? float_list_to_vector (me->get_object ("full-score-pure-minimum-translations")) + : get_pure_minimum_translations (me, all_grobs, Y_AXIS, start, end);

   if (translates.size ())
     {
@@ -369,6 +399,7 @@ ADD_INTERFACE (Align_interface,
                /* properties */
                "align-dir "
                "axes "
+               "full-score-pure-minimum-translations "
                "elements "
                "padding "
                "positioning-done "
Index: lily/include/align-interface.hh
diff --git a/lily/include/align-interface.hh b/lily/include/align-interface.hh index b7ef1d5f01e7ba6353fd128d29188842e1f3b705..f7b85f42aaba5b6bacf41d3eade7f24e2b360c74 100644
--- a/lily/include/align-interface.hh
+++ b/lily/include/align-interface.hh
@@ -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: scm/define-grob-properties.scm
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index 52700b310d8de8002fdefa7084bbde38b8da4dc2..2272705398809ada74405b89818258d4415e1680 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -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: scm/define-grobs.scm
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index 9e213c6daad1d7b52ea41877447230a7a13d186f..36340f4a26b170911bf0fd69323d24f6b454e657 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -278,7 +278,8 @@
        (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
@@ -2437,7 +2438,8 @@
        (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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]