]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-breaking.cc
Doc-es: Texidoc strings -- Fretted
[lilypond.git] / lily / page-breaking.cc
index c728208c37c082539a92dc73dbcf727799559179..1ae769e82d641d79145e53491bd77795baf2d4a4 100644 (file)
@@ -687,16 +687,19 @@ Page_spacing_result
 Page_breaking::space_systems_on_n_pages (vsize configuration, vsize n, vsize first_page_num)
 {
   Page_spacing_result ret;
-  assert (n >= min_page_count (configuration, first_page_num));
 
   cache_line_details (configuration);
-  if (n > cached_line_details_.size ())
-    return Page_spacing_result ();
-  if (n == 1)
+  bool valid_n = (n >= min_page_count (configuration, first_page_num)
+                 && n <= cached_line_details_.size ());
+
+  if (!valid_n)
+    programming_error ("number of pages is out of bounds");
+
+  if (n == 1 && valid_n)
     ret = space_systems_on_1_page (cached_line_details_,
                                   page_height (first_page_num, is_last ()),
                                   ragged () || (is_last () && ragged_last ()));
-  else if (n == 2)
+  else if (n == 2 && valid_n)
     ret = space_systems_on_2_pages (configuration, first_page_num);
   else
     {
@@ -710,7 +713,19 @@ Page_breaking::space_systems_on_n_pages (vsize configuration, vsize n, vsize fir
 Real
 Page_breaking::blank_page_penalty () const
 {
-  SCM penalty_sym = is_last () ? ly_symbol2scm ("blank-last-page-force") : ly_symbol2scm ("blank-page-force");
+  SCM penalty_sym;
+
+  if (is_last ())
+    penalty_sym = ly_symbol2scm ("blank-last-page-force");
+  else if (ends_score ())
+    penalty_sym = ly_symbol2scm ("blank-after-score-page-force");
+  else
+    penalty_sym = ly_symbol2scm ("blank-page-force");
+
+  Break_position const &pos = breaks_[current_end_breakpoint_];
+  if (Paper_score *ps = system_specs_[pos.system_spec_index_].pscore_)
+    return robust_scm2double (ps->layout ()->lookup_variable (penalty_sym), 0.0);
+
   return robust_scm2double (book_->paper_->lookup_variable (penalty_sym), 0.0);
 }
 
@@ -722,8 +737,12 @@ Page_breaking::space_systems_on_n_or_one_more_pages (vsize configuration, vsize
 
   cache_line_details (configuration);
   vsize min_p_count = min_page_count (configuration, first_page_num);
+  bool valid_n = n >= min_p_count || n <= cached_line_details_.size ();
 
-  if (n == 1)
+  if (!valid_n)
+    programming_error ("both page counts are out of bounds");
+
+  if (n == 1 && valid_n)
     {
       bool rag = ragged () || (is_last () && ragged_last ());
       Real height = page_height (first_page_num, is_last ());
@@ -737,9 +756,9 @@ Page_breaking::space_systems_on_n_or_one_more_pages (vsize configuration, vsize
     {
       Page_spacer ps (cached_line_details_, first_page_num, this);
       
-      if (n >= min_p_count)
+      if (n >= min_p_count || !valid_n)
        n_res = ps.solve (n);
-      if (n < cached_line_details_.size ())
+      if (n < cached_line_details_.size () || !valid_n)
        m_res = ps.solve (n+1);
     }
 
@@ -1001,6 +1020,12 @@ Page_breaking::is_last () const
   return current_end_breakpoint_ == last_break_position ();
 }
 
+bool
+Page_breaking::ends_score () const
+{
+  return breaks_[current_end_breakpoint_].score_ender_;
+}
+
 vsize
 Page_breaking::last_break_position () const
 {