]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-turn-page-breaking.cc
Imported Upstream version 2.14.2
[lilypond.git] / lily / page-turn-page-breaking.cc
index 97b58467b60bab8ca34cdbd0b6d118dd9f082afd..07b61d92bf84bec98e0537a8ee8a5c66413f0e1e 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  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--2011 Joe Neeman <joeneeman@gmail.com>
 
-  (c) 2006--2009 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>)
 {
 }
 
@@ -65,14 +87,14 @@ Page_turn_page_breaking::put_systems_on_pages (vsize start,
   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;
@@ -192,8 +214,8 @@ Page_turn_page_breaking::calc_subproblem (vsize ending_breakpoint)
       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;
@@ -247,6 +269,9 @@ Page_turn_page_breaking::make_lines (vector<Break_node> *psoln)
 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++)
     {