X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Foptimal-page-breaking.cc;h=e404711b4b70066214846c83a5e34d2a6708c297;hb=608a22622286e46de0f4b6ad78e6a349eab9332a;hp=e9010aec09345ef715d247a20a0a854d34bc5956;hpb=e1a149d0cc60b02e86209387958f4028567dd366;p=lilypond.git diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index e9010aec09..e404711b4b 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2010 Joe Neeman + Copyright (C) 2006--2011 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 @@ -52,6 +52,8 @@ Optimal_page_breaking::solve () Line_division ideal_line_division = current_configuration (0); Line_division best_division = ideal_line_division; vsize min_sys_count = 1; + + // Note that system_count () only counts non-title systems. vsize ideal_sys_count = system_count (); if (!scm_is_integer (forced_page_count)) @@ -59,13 +61,9 @@ Optimal_page_breaking::solve () /* find out the ideal number of pages */ message (_ ("Finding the ideal number of pages...")); - if (systems_per_page () > 0) - best = space_systems_with_fixed_number_per_page (0, first_page_num); - else - best = space_systems_on_best_pages (0, first_page_num); + best = space_systems_on_best_pages (0, first_page_num); page_count = best.systems_per_page_.size (); - ideal_sys_count = best.system_count (); min_sys_count = ideal_sys_count - best.systems_per_page_.back (); if (page_count > 1 && best.systems_per_page_[page_count - 2] > 1) @@ -75,12 +73,32 @@ Optimal_page_breaking::solve () } else { + /* If systems-per-page and page-count are both specified, we know exactly + how many systems should be present. */ + if (systems_per_page () > 0) + { + ideal_sys_count = systems_per_page () * page_count; + + if (ideal_sys_count > max_system_count (0, end) + || ideal_sys_count < min_system_count (0, end)) + { + warning (_ ("could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page")); + ideal_sys_count = system_count (); + min_sys_count = page_count; + } + else + { + set_current_breakpoints (0, end, ideal_sys_count); + min_sys_count = max_sys_count = ideal_sys_count; + ideal_line_division = best_division = current_configuration (0); + } + } + else + min_sys_count = page_count; + /* TODO: the following line will spit out programming errors if the ideal line spacing doesn't fit on PAGE_COUNT pages */ - /* TODO: the interaction between systems_per_page and page_count needs to - be considered. */ best = space_systems_on_n_pages (0, page_count, first_page_num); - min_sys_count = page_count; } if (page_count == 1) @@ -92,7 +110,7 @@ Optimal_page_breaking::solve () /* try a smaller number of systems than the ideal number for line breaking */ Line_division bound = ideal_line_division; - for (vsize sys_count = ideal_sys_count; --sys_count >= min_sys_count;) + for (vsize sys_count = ideal_sys_count + 1; --sys_count >= min_sys_count;) { Page_spacing_result best_for_this_sys_count; set_current_breakpoints (0, end, sys_count, Line_division (), bound);