X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-spacing.cc;h=b04d3f394a17bde64118bc01598bf6bf19f04488;hb=4aede8f7b3b9c8fa7a9807fc90dc9c23abbda474;hp=b556c1c3053273ac565396087b87a80843f787fd;hpb=8fbc1ac88d969b8ce2338fc1cefbf9708b7434f3;p=lilypond.git diff --git a/lily/page-spacing.cc b/lily/page-spacing.cc index b556c1c305..b04d3f394a 100644 --- a/lily/page-spacing.cc +++ b/lily/page-spacing.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2010 Joe Neeman + Copyright (C) 2006--2011 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #include "page-spacing.hh" +#include "international.hh" #include "matrix.hh" #include "page-breaking.hh" #include "warn.hh" @@ -50,6 +51,8 @@ Page_spacing::append_system (const Line_details &line) if (rod_height_) { rod_height_ += line.tallness_; + spring_len_ += last_line_.spring_length (line); + } else { @@ -57,7 +60,7 @@ Page_spacing::append_system (const Line_details &line) first_line_ = line; } - spring_len_ += line.space_; + rod_height_ += account_for_footnotes (line); inverse_spring_k_ += line.inverse_hooke_; last_line_ = line; @@ -65,16 +68,41 @@ Page_spacing::append_system (const Line_details &line) calc_force (); } +Real +Page_spacing::account_for_footnotes (Line_details const &line) +{ + Real footnote_height = 0.0; + for (vsize i = 0; i < line.footnotes_.size (); i++) + { + footnote_height += (has_footnotes_ + ? 0.0 + : (breaker_->footnote_separator_stencil_height () + + breaker_->footnote_padding ())); + + has_footnotes_ = true; + Interval extent = line.footnotes_[i]->extent (Y_AXIS); + footnote_height += extent[UP] - extent[DOWN]; + footnote_height += breaker_->footnote_padding (); + } + + return (footnote_height + - (has_footnotes_ + ? breaker_->footnote_padding () + breaker_->footnote_footer_padding () + : 0.0)); +} + void Page_spacing::prepend_system (const Line_details &line) { - if (!rod_height_) + if (rod_height_) + spring_len_ += line.spring_length (first_line_); + else last_line_ = line; rod_height_ -= first_line_.full_height (); rod_height_ += first_line_.tallness_; rod_height_ += line.full_height(); - spring_len_ += line.space_; + rod_height_ += account_for_footnotes (line); inverse_spring_k_ += line.inverse_hooke_; first_line_ = line; @@ -87,6 +115,7 @@ Page_spacing::clear () { force_ = rod_height_ = spring_len_ = 0; inverse_spring_k_ = 0; + has_footnotes_ = false; } @@ -247,10 +276,13 @@ Page_spacer::calc_subproblem (vsize page, vsize line) bool last = line == lines_.size () - 1; // Note: if page == VPOS then we don't actually know yet which page number we're - // working on, so we have to recalculate the page height in the loop. In that case, - // the algorithm may not be optimal: if our page has a very large header then perhaps - // we need to look ahead a few systems in order to find the best solution. But - // we won't, because we stop once we overfill the page with the large header. + // working on, so we have to recalculate the page height in the loop. Therefore + // our early-exit condition from the loop depends on paper_height rather than + // page_height (ie. we break only if we would overfill a page without margins + // or headers/footers). Otherwise, the algorithm would not be optimal: + // if our page has a very large header then perhaps + // we should look ahead a few systems in order to find the best solution. A + // good example of this is input/regression/page-spacing-tall-headfoot.ly vsize page_num = page == VPOS ? 0 : page; Real paper_height = breaker_->paper_height (); Page_spacing space (breaker_->page_height (page_num + first_page_num_, last),