#include "output-def.hh"
#include "paper-book.hh"
#include "paper-column.hh"
+#include "paper-score.hh"
#include "pointer-group-interface.hh"
#include "prob.hh"
#include "skyline-pair.hh"
Spring spring (0, 0);
Real padding = 0.0;
+ Real indent = line_dimensions_int (sys->paper_score ()->layout (), sys->get_rank ())[LEFT];
alter_spring_from_spacing_spec (spec, &spring);
read_spacing_spec (spec, &padding, ly_symbol2scm ("padding"));
- append_system (sys, spring, padding);
+ append_system (sys, spring, indent, padding);
last_system_was_title = false;
}
else if (Prob *p = unsmob_prob (scm_car (s)))
}
void
-Page_layout_problem::append_system (System *sys, Spring const& spring, Real padding)
+Page_layout_problem::append_system (System *sys, Spring const& spring, Real indent, Real padding)
{
Grob *align = sys->get_vertical_alignment ();
if (!align)
extract_grob_set (align, "elements", all_elts);
vector<Grob*> elts = filter_dead_elements (all_elts);
- vector<Real> minimum_offsets = Align_interface::get_minimum_translations (align, elts, Y_AXIS,
- false, 0, 0);
+ vector<Real> minimum_offsets = Align_interface::get_minimum_translations_without_min_dist (align, elts, Y_AXIS);
Skyline up_skyline (UP);
Skyline down_skyline (DOWN);
build_system_skyline (elts, minimum_offsets, &up_skyline, &down_skyline);
+ up_skyline.shift (indent);
+ down_skyline.shift (indent);
Real minimum_distance = up_skyline.distance (bottom_skyline_) + padding;
}
Spring spring (0.5, 0.0);
- SCM spec = elts[last_spaceable_staff]->get_property ("next-staff-spacing");
+ SCM spec = elts[last_spaceable_staff]->get_property ("staff-staff-spacing");
alter_spring_from_spacing_spec (spec, &spring);
springs_.push_back (spring);
return false;
}
+// If there is a forced, fixed spacing between BEFORE and AFTER, return it.
+// Otherwise, return -infinity_f.
+// If after is spaceable, it is the (spaceable_index + 1)th spaceable grob in
+// its alignment.
+Real
+Page_layout_problem::get_fixed_spacing (Grob *before, Grob *after, int spaceable_index, bool pure, int start, int end)
+{
+ SCM spec = Page_layout_problem::get_spacing_spec (before, after, pure, start, end);
+ Real ret = -infinity_f;
+ Real stretchability = 0;
+ if (Page_layout_problem::read_spacing_spec (spec, &stretchability, ly_symbol2scm ("stretchability"))
+ && stretchability == 0)
+ Page_layout_problem::read_spacing_spec (spec, &ret, ly_symbol2scm ("space"));
+
+ // If we're pure, then paper-columns have not had their systems set,
+ // and so elts[i]->get_system () is unreliable.
+ System *sys = pure ? Grob::get_system (before) : before->get_system ();
+ Grob *left_bound = sys ? sys->get_maybe_pure_bound (LEFT, pure, start, end) : 0;
+
+ if (is_spaceable (before) && is_spaceable (after) && left_bound)
+ {
+ SCM details = left_bound->get_property ("line-break-system-details");
+ SCM manual_dists = ly_assoc_get (ly_symbol2scm ("alignment-distances"), details, SCM_EOL);
+ if (scm_is_pair (manual_dists))
+ {
+ SCM forced = robust_list_ref (spaceable_index - 1, manual_dists);
+ if (scm_is_number (forced))
+ ret = max (ret, scm_to_double (forced));
+ }
+ }
+ return ret;
+}
+
static SCM
add_stretchability (SCM alist, Real stretch)
{
if (is_spaceable (before))
{
if (is_spaceable (after))
- return before->get_maybe_pure_property ("next-staff-spacing", pure, start, end);
+ return before->get_maybe_pure_property ("staff-staff-spacing", pure, start, end);
else
{
Direction affinity = to_dir (after->get_maybe_pure_property ("staff-affinity", pure, start, end));
return (affinity == DOWN)
- ? add_stretchability (after->get_maybe_pure_property ("non-affinity-spacing", pure, start, end),
+ ? add_stretchability (after->get_maybe_pure_property ("nonstaff-unrelatedstaff-spacing", pure, start, end),
LARGE_STRETCH)
- : after->get_maybe_pure_property ("inter-staff-spacing", pure, start, end);
+ : after->get_maybe_pure_property ("nonstaff-relatedstaff-spacing", pure, start, end);
}
}
else
{
Direction affinity = to_dir (before->get_maybe_pure_property ("staff-affinity", pure, start, end));
return (affinity == UP)
- ? add_stretchability (before->get_maybe_pure_property ("non-affinity-spacing", pure, start, end),
+ ? add_stretchability (before->get_maybe_pure_property ("nonstaff-unrelatedstaff-spacing", pure, start, end),
LARGE_STRETCH)
- : before->get_maybe_pure_property ("inter-staff-spacing", pure, start, end);
+ : before->get_maybe_pure_property ("nonstaff-relatedstaff-spacing", pure, start, end);
}
else
{
after_affinity = before_affinity;
}
if (before_affinity != UP)
- return before->get_maybe_pure_property ("inter-loose-line-spacing", pure, start, end);
+ return before->get_maybe_pure_property ("nonstaff-nonstaff-spacing", pure, start, end);
else if (after_affinity != DOWN)
- return before->get_maybe_pure_property ("inter-loose-line-spacing", pure, start, end);
- return add_stretchability (before->get_maybe_pure_property ("non-affinity-spacing", pure, start, end),
+ return before->get_maybe_pure_property ("nonstaff-nonstaff-spacing", pure, start, end);
+ return add_stretchability (before->get_maybe_pure_property ("nonstaff-unrelatedstaff-spacing", pure, start, end),
LARGE_STRETCH);
}
}