/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2009--2010 Joe Neeman <joeneeman@gmail.com>
+ Copyright (C) 2009--2011 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
#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,
- false, 0, 0);
+ vector<Real> minimum_offsets = Align_interface::get_minimum_translations_without_min_dist (align, elts, Y_AXIS);
+ vector<Real> minimum_offsets_with_min_dist = Align_interface::get_minimum_translations (align, elts, Y_AXIS);
Skyline up_skyline (UP);
Skyline down_skyline (DOWN);
- build_system_skyline (elts, minimum_offsets, &up_skyline, &down_skyline);
-
- Real minimum_distance = up_skyline.distance (bottom_skyline_) + padding;
+ build_system_skyline (elts, minimum_offsets_with_min_dist, &up_skyline, &down_skyline);
+ up_skyline.shift (indent);
+ down_skyline.shift (indent);
+
+ /*
+ We need to call distance with skyline-horizontal-padding because
+ the system skyline-horizontal-padding is not added during the creation
+ of an individual staff. So we add the padding for the distance check
+ at the time of adding in the system.
+ */
+ Real minimum_distance = up_skyline.distance (bottom_skyline_, robust_scm2double (sys->get_property ("skyline-horizontal-padding"), 0)) + padding;
Spring spring_copy = spring;
spring_copy.ensure_min_distance (minimum_distance);
}
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);
solution_ = spacer.spring_positions ();
if (!spacer.fits ())
- warning (_f ("couldn't fit music on page: overflow is %f",
- spacer.configuration_length(spacer.force()) - page_height_));
+ {
+ Real overflow = spacer.configuration_length (spacer.force ())
+ - page_height_;
+ if (ragged && overflow < 1e-6)
+ warning (_ ("cannot fit music on page: ragged-spacing was requested, but page was compressed"));
+ else
+ {
+ warning (_f ("cannot fit music on page: overflow is %f",
+ overflow));
+ warning (_ ("compressing music to fit"));
+ vsize space_count = solution_.size ();
+ Real spacing_increment = overflow / (space_count - 2);
+ for (vsize i = 2; i < space_count; i++)
+ solution_[i] -= (i-1) * spacing_increment;
+ }
+ }
}
// The solution_ vector stores the position of every live VerticalAxisGroup
Real
Page_layout_problem::get_fixed_spacing (Grob *before, Grob *after, int spaceable_index, bool pure, int start, int end)
{
+ Spanner *after_sp = dynamic_cast<Spanner*> (after);
+ SCM cache_symbol = (is_spaceable (before) && is_spaceable (after))
+ ? ly_symbol2scm ("spaceable-fixed-spacing")
+ : ly_symbol2scm ("loose-fixed-spacing");
+ if (pure)
+ {
+ // The result of this function doesn't depend on "end," so we can reduce the
+ // size of the cache by ignoring it.
+ SCM cached = after_sp->get_cached_pure_property (cache_symbol, start, 0);
+ if (scm_is_number (cached))
+ return robust_scm2double (cached, 0.0);
+ }
+
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"));
+ Page_layout_problem::read_spacing_spec (spec, &ret, ly_symbol2scm ("basic-distance"));
// If we're pure, then paper-columns have not had their systems set,
// and so elts[i]->get_system () is unreliable.
ret = max (ret, scm_to_double (forced));
}
}
+
+ // Cache the result. As above, we ignore "end."
+ if (pure)
+ after_sp->cache_pure_property (cache_symbol, start, 0, scm_from_double (ret));
+
return ret;
}
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);
}
}
Real space;
Real stretch;
Real min_dist;
- if (read_spacing_spec (spec, &space, ly_symbol2scm ("space")))
+ if (read_spacing_spec (spec, &space, ly_symbol2scm ("basic-distance")))
spring->set_distance (space);
if (read_spacing_spec (spec, &min_dist, ly_symbol2scm ("minimum-distance")))
spring->set_min_distance (min_dist);