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 ())
{
/* properties */
"align-dir "
"axes "
+ "full-score-pure-minimum-translations "
"elements "
"padding "
"positioning-done "
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);
#include <libguile.h>
#include <string.h>
+#include <vector>
/*
Hack for various MacOS incarnations.
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);
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)
{
(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.")
(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