/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2009--2012 Joe Neeman <joeneeman@gmail.com>
+ Copyright (C) 2009--2014 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 "text-interface.hh"
/*
- Returns the number of footntoes associated with a given line.
+ Returns the number of footnotes associated with a given line.
*/
vector<Grob *>
in duplicated work, either by making this process less complicated or (preferably)
by passing its results downstream.
*/
- vector<SCM> footnote_number_markups; // Holds the numbering markups.
- vector<Stencil> footnote_number_stencils; // Holds translated versions of the stencilized numbering markups.
+
+ // find the maximum X_AXIS length
+ Real max_length = -infinity_f;
+
for (vsize i = 0; i < fn_count; i++)
{
if (fn_grobs[i])
(void) scm_call_1 (assertion_function, scm_from_int (counter));
}
SCM markup = scm_call_1 (numbering_function, scm_from_int (counter));
- Stencil *s = unsmob_stencil (Text_interface::interpret_markup (layout, props, markup));
- if (!s)
+ SCM stencil = Text_interface::interpret_markup (layout, props, markup);
+ Stencil *st = unsmob_stencil (stencil);
+ if (!st)
{
programming_error ("Your numbering function needs to return a stencil.");
- footnote_number_markups.push_back (SCM_EOL);
- footnote_number_stencils.push_back (Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL));
- }
- else
- {
- footnote_number_markups.push_back (markup);
- footnote_number_stencils.push_back (*s);
+ markup = SCM_EOL;
+ stencil = Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL).smobbed_copy ();
+ st = unsmob_stencil (stencil);
}
+ in_text_numbers = scm_cons (markup, in_text_numbers);
+ numbers = scm_cons (stencil, numbers);
+
+ if (!st->extent (X_AXIS).is_empty ())
+ max_length = max (max_length, st->extent (X_AXIS)[RIGHT]);
+
counter++;
}
- // find the maximum X_AXIS length
- Real max_length = -infinity_f;
- for (vsize i = 0; i < fn_count; i++)
- max_length = max (max_length, footnote_number_stencils[i].extent (X_AXIS).length ());
+ in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
+ numbers = scm_reverse_x (numbers, SCM_EOL);
/*
translate each stencil such that it attains the correct maximum length and bundle the
footnotes into a scheme object.
*/
- for (vsize i = 0; i < fn_count; i++)
+ for (SCM p = numbers; scm_is_pair (p); p = scm_cdr (p))
{
- in_text_numbers = scm_cons (footnote_number_markups[i], in_text_numbers);
- footnote_number_stencils[i].translate_axis ((max_length
- - footnote_number_stencils[i].extent (X_AXIS).length ()),
- X_AXIS);
- numbers = scm_cons (footnote_number_stencils[i].smobbed_copy (), numbers);
+ Stencil *st = unsmob_stencil (scm_car (p));
+ if (!st->extent (X_AXIS).is_empty ())
+ st->translate_axis ((max_length - st->extent (X_AXIS)[RIGHT]),
+ X_AXIS);
}
- in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
- numbers = scm_reverse_x (numbers, SCM_EOL);
-
// build the footnotes
for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s))
: 0;
// Corner case: there was only one staff, and it wasn't spaceable.
- // Mark it spaceable, because we do not allow non-spaceable staves
- // to be at the top or bottom of a system.
if (!found_spaceable_staff && elts.size ())
mark_as_spaceable (elts[0]);
}
if (sky)
{
- minimum_distance = (*sky)[UP].distance (bottom_skyline_);
+ minimum_distance = max ((*sky)[UP].distance (bottom_skyline_),
+ bottom_loose_baseline_);
bottom_skyline_ = (*sky)[DOWN];
}
else if (Stencil *sten = unsmob_stencil (prob->get_property ("stencil")))
bottom_skyline_.clear ();
bottom_skyline_.set_minimum_height (iv[DOWN]);
}
+ bottom_loose_baseline_ = 0.0;
Spring spring_copy = spring;
if (tight_spacing)
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"));
+ warning (_ ("ragged-bottom was specified, but page must be compressed"));
else
{
- warning (_f ("cannot fit music on page: overflow is %f",
+ warning (_f ("compressing over-full page by %.1f staff-spaces",
overflow));
- warning (_ ("compressing music to fit"));
+ force_ = -infinity_f;
vsize space_count = solution_.size ();
Real spacing_increment = overflow / (space_count - 2);
for (vsize i = 2; i < space_count; i++)
}
else // ! is_spaceable
{
+ if (staff->extent (staff, Y_AXIS).is_empty ())
+ continue;
+
if (loose_lines.empty ())
loose_lines.push_back (last_spaceable_line);