X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-spacing.cc;h=33cf18a3fe8a64f52821229f96a3bd73e407ab1c;hb=e27f4adb184e30ee9202255a4d9807dd56dad3e1;hp=ab8085c1d59b92900fd46cd7ac72f59f425e3f91;hpb=794dcbdb52faf4292036cd1b0270a956cf4316a3;p=lilypond.git diff --git a/lily/page-spacing.cc b/lily/page-spacing.cc index ab8085c1d5..33cf18a3fe 100644 --- a/lily/page-spacing.cc +++ b/lily/page-spacing.cc @@ -1,10 +1,20 @@ /* - page-spacing.cc - implement routines for spacing - systems vertically on pages + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2006--2010 Joe Neeman - (c) 2006--2009 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "page-spacing.hh" @@ -37,12 +47,16 @@ Page_spacing::resize (Real new_height) void Page_spacing::append_system (const Line_details &line) { - if (!rod_height_) - first_line_ = line; - - rod_height_ += last_line_.padding_; + if (rod_height_) + { + rod_height_ += line.tallness_; + } + else + { + rod_height_ += line.full_height (); + first_line_ = line; + } - rod_height_ += line.extent_.length (); spring_len_ += line.space_; inverse_spring_k_ += line.inverse_hooke_; @@ -54,12 +68,12 @@ Page_spacing::append_system (const Line_details &line) void Page_spacing::prepend_system (const Line_details &line) { - if (rod_height_) - rod_height_ += line.padding_; - else + if (!rod_height_) last_line_ = line; - rod_height_ += line.extent_.length (); + rod_height_ -= first_line_.full_height (); + rod_height_ += first_line_.tallness_; + rod_height_ += line.full_height(); spring_len_ += line.space_; inverse_spring_k_ += line.inverse_hooke_; @@ -235,6 +249,18 @@ Page_spacer::calc_subproblem (vsize page, vsize line) penalty += lines_[page_start-1].page_penalty_ + (page % 2 == 0) ? lines_[page_start-1].turn_penalty_ : 0; + /* Deal with widow/orphan lines */ + /* Last line of paragraph is first line on the new page */ + if ((page_start > 0) && + (page_start < lines_.size ()) && + (lines_[page_start].last_markup_line_)) + penalty += breaker_->orphan_penalty (); + /* First line of paragraph is last line on the previous page */ + if ((page_start > 0) && + (page_start < lines_.size ()) && + (lines_[page_start-1].first_markup_line_)) + penalty += breaker_->orphan_penalty (); + demerits += penalty; if (demerits < cur.demerits_ || page_start == line) {