/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2009 Joe Neeman <joeneeman@gmail.com>
+ Copyright (C) 2009--2010 Joe Neeman <joeneeman@gmail.com>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
vector<Real> loose_line_min_distances;
Grob *last_spaceable_line = 0;
Real last_spaceable_line_translation = 0;
+ Interval last_title_extent;
for (vsize i = 0; i < elements_.size (); ++i)
{
if (elements_[i].prob)
{
*tail = scm_cons (scm_from_double (solution_[spring_idx]), SCM_EOL);
tail = SCM_CDRLOC (*tail);
+ Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS);
// Lay out any non-spaceable lines between this line and
// the last one.
if (loose_lines.size ())
{
Interval loose_extent = loose_lines.back ()->extent (loose_lines.back (), Y_AXIS);
- Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS);
Real min_distance = -loose_extent[DOWN] + prob_extent[UP]; // TODO: include padding/minimum-distance
loose_line_min_distances.push_back (min_distance);
last_spaceable_line = 0;
last_spaceable_line_translation = -solution_[spring_idx];
+ last_title_extent = prob_extent;
spring_idx++;
}
else
min_dist = Axis_group_interface::minimum_distance (loose_lines.back (),
staff,
Y_AXIS);
+ else if (!last_title_extent.is_empty ())
+ { // distance to the preceding title
+ // TODO: add options for controlling the space between a loose line
+ // and a title/markup preceding it.
+ min_dist = staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN];
+ }
else // distance to the top margin
min_dist = header_padding_ + header_height_ + staff->extent (staff, Y_AXIS)[UP];
Simple_spacer spacer;
for (vsize i = 0; i + 1 < loose_lines.size (); ++i)
{
- SCM spec = get_spacing_spec (loose_lines[i], loose_lines[i+1]);
+ SCM spec = get_spacing_spec (loose_lines[i], loose_lines[i+1], false, 0, INT_MAX);
Spring spring (1.0, 0.0);
alter_spring_from_spacing_spec (spec, &spring);
spring.ensure_min_distance (min_distances[i]);
// Returns the spacing spec connecting BEFORE to AFTER.
SCM
-Page_layout_problem::get_spacing_spec (Grob *before, Grob *after)
+Page_layout_problem::get_spacing_spec (Grob *before, Grob *after, bool pure, int start, int end)
{
// If there are no spacing wishes, return a very flexible spring.
// This will occur, for example, if there are lyrics at the bottom of
if (is_spaceable (before))
{
if (is_spaceable (after))
- return before->get_property ("next-staff-spacing");
+ return before->get_maybe_pure_property ("next-staff-spacing", pure, start, end);
else
{
- Direction affinity = to_dir (after->get_property ("staff-affinity"));
+ Direction affinity = to_dir (after->get_maybe_pure_property ("staff-affinity", pure, start, end));
return (affinity == DOWN)
- ? add_stretchability (after->get_property ("non-affinity-spacing"), LARGE_STRETCH)
- : after->get_property ("inter-staff-spacing");
+ ? add_stretchability (after->get_maybe_pure_property ("non-affinity-spacing", pure, start, end),
+ LARGE_STRETCH)
+ : after->get_maybe_pure_property ("inter-staff-spacing", pure, start, end);
}
}
else
{
if (is_spaceable (after))
{
- Direction affinity = to_dir (before->get_property ("staff-affinity"));
+ Direction affinity = to_dir (before->get_maybe_pure_property ("staff-affinity", pure, start, end));
return (affinity == UP)
- ? add_stretchability (before->get_property ("non-affinity-spacing"), LARGE_STRETCH)
- : before->get_property ("inter-staff-spacing");
+ ? add_stretchability (before->get_maybe_pure_property ("non-affinity-spacing", pure, start, end),
+ LARGE_STRETCH)
+ : before->get_maybe_pure_property ("inter-staff-spacing", pure, start, end);
}
else
{
- Direction before_affinity = to_dir (before->get_property ("staff-affinity"));
- Direction after_affinity = to_dir (after->get_property ("staff-affinity"));
+ Direction before_affinity = to_dir (before->get_maybe_pure_property ("staff-affinity", pure, start, end));
+ Direction after_affinity = to_dir (after->get_maybe_pure_property ("staff-affinity", pure, start, end));
if (after_affinity > before_affinity)
{
warning (_ ("staff-affinities should only decrease"));
after_affinity = before_affinity;
}
if (before_affinity != UP)
- return before->get_property ("inter-loose-line-spacing");
+ return before->get_maybe_pure_property ("inter-loose-line-spacing", pure, start, end);
else if (after_affinity != DOWN)
- return before->get_property ("inter-loose-line-spacing");
- return add_stretchability (before->get_property ("non-affinity-spacing"), LARGE_STRETCH);
+ 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),
+ LARGE_STRETCH);
}
}