[Top][All Lists]
[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
- Caches pure translations for full score. (issue 5349043),
mtsolo <=