X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-breaking.cc;h=76a874d4e38f1aac87035c9c09016234fc8b5f23;hb=f9214bac21e9926dc3248416f58190c98c4167a9;hp=fee3fa26d914ebd52cad0654302619b160108996;hpb=fb5d36ef6d026fdaa2b5d6c207eefd39374bff97;p=lilypond.git diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index fee3fa26d9..76a874d4e3 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2007 Joe Neeman */ #include "page-breaking.hh" @@ -75,9 +75,15 @@ void Page_breaking::break_into_pieces (vsize start_break, vsize end_break, Line_division const &div) { vector chunks = chunk_list (start_break, end_break); - assert (chunks.size () == div.size () + 1); + bool ignore_div = false; + if (chunks.size () != div.size () + 1) + { + programming_error ("did not find a valid page breaking configuration"); + ignore_div = true; + assert (0); + } - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_) @@ -86,7 +92,9 @@ Page_breaking::break_into_pieces (vsize start_break, vsize end_break, Line_divis vsize end; line_breaker_args (sys, chunks[i], chunks[i+1], &start, &end); - vector pos = line_breaking_[sys].get_solution (start, end, div[i]); + vector pos = ignore_div + ? line_breaking_[sys].get_best_solution (start, end) + : line_breaking_[sys].get_solution (start, end, div[i]); all_[sys].pscore_->root_system ()->break_into_pieces (pos); } } @@ -120,7 +128,7 @@ Page_breaking::line_details (vsize start_break, vsize end_break, Line_division c vector ret; assert (chunks.size () == div.size () + 1); - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_) @@ -176,24 +184,22 @@ SCM Page_breaking::make_pages (vector lines_per_page, SCM systems) { SCM layout_module = scm_c_resolve_module ("scm layout-page-layout"); - SCM dump_module = scm_c_resolve_module ("scm layout-page-dump"); SCM page_module = scm_c_resolve_module ("scm page"); SCM make_page = scm_c_module_lookup (layout_module, "make-page-from-systems"); - SCM write_page_breaks = scm_c_module_lookup (dump_module, "write-page-breaks"); SCM page_stencil = scm_c_module_lookup (page_module, "page-stencil"); make_page = scm_variable_ref (make_page); - write_page_breaks = scm_variable_ref (write_page_breaks); page_stencil = scm_variable_ref (page_stencil); SCM book = book_->self_scm (); bool ragged_all = to_boolean (book_->paper_->c_variable ("ragged-bottom")); bool ragged_last = to_boolean (book_->paper_->c_variable ("ragged-last-bottom")); + int first_page_number = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); SCM ret = SCM_EOL; for (vsize i = 0; i < lines_per_page.size (); i++) { - SCM page_num = scm_from_int (i + 1); + SCM page_num = scm_from_int (i + first_page_number); SCM last = scm_from_bool (i == lines_per_page.size () - 1); SCM ragged = scm_from_bool (ragged_all || (to_boolean (last) && ragged_last)); SCM line_count = scm_from_int (lines_per_page[i]); @@ -206,9 +212,6 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) systems = scm_list_tail (systems, line_count); } ret = scm_reverse (ret); - - if (to_boolean (book_->paper_->c_variable ("write-page-layout"))) - scm_apply_1 (write_page_breaks, ret, SCM_EOL); return ret; } @@ -260,7 +263,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break) { if (all_[i].pscore_) { - vector cols = all_[i].pscore_->root_system ()->columns (); + vector cols = all_[i].pscore_->root_system ()->used_columns (); vector line_breaker_columns; line_breaker_columns.push_back (0); @@ -282,8 +285,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break) if ((break_point || chunk_end) && !last) line_breaker_columns.push_back (j); } - line_breaking_.push_back (Constrained_breaking (line_breaker_columns)); - line_breaking_.back ().set_pscore (all_[i].pscore_); + line_breaking_.push_back (Constrained_breaking (all_[i].pscore_, line_breaker_columns)); } else { @@ -292,7 +294,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break) breaks_.push_back (Break_position (i)); chunks_.push_back (Break_position (i)); - line_breaking_.push_back (Constrained_breaking ()); + line_breaking_.push_back (Constrained_breaking (NULL)); } } } @@ -347,7 +349,7 @@ Page_breaking::system_count_bounds (vector const &chunks, bool m Line_division ret; ret.resize (chunks.size () - 1, 1); - for (vsize i = 0; i < chunks.size () - 1; i++) + for (vsize i = 0; i + 1 < chunks.size (); i++) { vsize sys = next_system (chunks[i]); if (all_[sys].pscore_)