/*
- page-turn-page-breaking.cc -- implement Page_turn_page_breaking
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 2006--2010 Joe Neeman <joeneeman@gmail.com>
- (c) 2006--2007 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
+ 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 <http://www.gnu.org/licenses/>.
*/
#include "page-turn-page-breaking.hh"
#include "system.hh"
#include "warn.hh"
+template<typename T>
static bool
-is_break (Grob *g)
+is_break (T *g)
{
- return scm_is_symbol (g->get_property ("page-turn-permission"));
+ bool turnable = scm_is_symbol (g->get_property ("page-turn-permission"));
+
+ if (turnable &&
+ (!scm_is_symbol (g->get_property ("page-break-permission"))
+ || !scm_is_symbol (g->get_property ("line-break-permission"))))
+ {
+ programming_error ("found a page-turnable place which was not breakable");
+ turnable = false;
+ }
+
+ return turnable;
}
Page_turn_page_breaking::Page_turn_page_breaking (Paper_book *pb)
- : Page_breaking (pb, is_break)
+ : Page_breaking (pb, is_break<Grob>, is_break<Prob>)
{
}
if (start == 0 && auto_first)
{
if (min_p_count % 2)
- result = space_systems_on_n_or_one_more_pages (configuration, min_p_count, page_number);
+ result = space_systems_on_n_or_one_more_pages (configuration, min_p_count, page_number, 0);
else
result = space_systems_on_n_pages (configuration, min_p_count, page_number);
}
else if (page_number % 2 == min_p_count % 2)
result = space_systems_on_n_pages (configuration, min_p_count, page_number);
else
- result = space_systems_on_n_or_one_more_pages (configuration, min_p_count, page_number);
+ result = space_systems_on_n_or_one_more_pages (configuration, min_p_count, page_number, blank_page_penalty ());
Break_node ret;
ret.prev_ = start - 1;
if (start > 0 && best.demerits_ < state_[start-1].demerits_)
continue;
- int p_num = robust_scm2int (book_->paper_->c_variable ("part-first-page-number"), 1);
+ int p_num = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1);
if (start > 0)
{
/* except possibly for the first page, enforce the fact that first_page_number_
if (start == 0 && end == 1
&& this_start_best.first_page_number_ == 1
&& this_start_best.page_count_ > 1)
- warning (_ ("cannot fit the first page turn onto a single page. "
- "Consider setting first-page-number to an even number."));
+ warning (_ ("cannot fit the first page turn onto a single page."
+ " Consider setting first-page-number to an even number."));
if (this_start_best.demerits_ < best.demerits_)
best = this_start_best;
SCM
Page_turn_page_breaking::make_pages (vector<Break_node> const &soln, SCM systems)
{
+ if (scm_is_null (systems))
+ return SCM_EOL;
+
vector<vsize> lines_per_page;
for (vsize i = 0; i < soln.size (); i++)
{
/* this should only actually modify first-page-number if
auto-first-page-number was true. */
- book_->paper_->set_variable (ly_symbol2scm ("part-first-page-number"),
+ book_->paper_->set_variable (ly_symbol2scm ("first-page-number"),
scm_from_int (soln[0].first_page_number_));
return Page_breaking::make_pages (lines_per_page, systems);
}