X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=fd519d5d751fee66e7af54d84a8f14b989c40e04;hb=2e9a5ee154d49c0a754f908f024f5423a342ab8f;hp=0887f9312eb78512548c971ccc8d07cf4f696072;hpb=f455506b0a4a32cea2c596a3a6e3f364e7ea5a90;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 0887f9312e..fd519d5d75 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -3,12 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2007 Jan Nieuwenhuizen + (c) 2004--2009 Jan Nieuwenhuizen */ #include "paper-book.hh" #include "grob.hh" +#include "international.hh" #include "main.hh" #include "output-def.hh" #include "paper-column.hh" @@ -108,12 +109,13 @@ Paper_book::add_performance (SCM s) performances_ = scm_cons (s, performances_); } -void +int Paper_book::output_aux (SCM output_channel, bool is_last, int *first_page_number, int *first_performance_number) { + int page_nb = 0; if (scm_is_pair (performances_)) { SCM proc = ly_lily_module_constant ("write-performances-midis"); @@ -127,27 +129,29 @@ Paper_book::output_aux (SCM output_channel, if (scm_is_pair (bookparts_)) { - for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) + for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) { bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p))); - pbookpart->output_aux (output_channel, - is_last_part, - first_page_number, - first_performance_number); + page_nb += pbookpart->output_aux (output_channel, + is_last_part, + first_page_number, + first_performance_number); } } else { if (scores_ == SCM_EOL) - return; + return 0; paper_->set_variable (ly_symbol2scm ("first-page-number"), scm_long2num (*first_page_number)); - paper_->set_variable (ly_symbol2scm ("part-is-last"), + paper_->set_variable (ly_symbol2scm ("is-last-bookpart"), ly_bool2scm (is_last)); /* Generate all stencils to trigger font loads. */ - *first_page_number += scm_ilength (pages ()); + page_nb = scm_ilength (pages ()); + *first_page_number += page_nb; } + return page_nb; } void @@ -155,11 +159,12 @@ Paper_book::output (SCM output_channel) { int first_page_number = robust_scm2int (paper_->c_variable ("first-page-number"), 1); int first_performance_number = 0; - output_aux (output_channel, - true, - &first_page_number, - &first_performance_number); - + if (!output_aux (output_channel, + true, + &first_page_number, + &first_performance_number)) + return; + SCM scopes = SCM_EOL; if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); @@ -170,25 +175,38 @@ Paper_book::output (SCM output_channel) if (get_program_option ("print-pages")) { - SCM func = scm_c_module_lookup (mod, "output-framework"); - - func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-framework")); + + if (framework != SCM_BOOL_F) + { + SCM func = scm_variable_ref (framework); + scm_apply_0 (func, scm_list_n (output_channel, + self_scm (), + scopes, + dump_fields (), + SCM_UNDEFINED)); + } + else + warning (_f ("program option -dprint-pages not supported by backend `%s'", + get_output_backend_name ())); } if (get_program_option ("preview")) { - SCM func = scm_c_module_lookup (mod, "output-preview-framework"); - func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-preview-framework")); + + if (framework != SCM_BOOL_F) + { + SCM func = scm_variable_ref (framework); + scm_apply_0 (func, scm_list_n (output_channel, + self_scm (), + scopes, + dump_fields (), + SCM_UNDEFINED)); + } + else + warning (_f ("program option -dpreview not supported by backend `%s'", + get_output_backend_name ())); } } @@ -517,7 +535,7 @@ Paper_book::systems () systems_ = SCM_EOL; if (scm_is_pair (bookparts_)) { - for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) + for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) systems_ = scm_append_x (scm_list_2 (systems_, pbookpart->systems ())); } @@ -577,11 +595,11 @@ Paper_book::pages () pages_ = SCM_EOL; if (scm_is_pair (bookparts_)) { - for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) + for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ())); } - else + else if (scm_is_pair (scores_)) { SCM proc = paper_->c_variable ("page-breaking-wrapper"); pages_ = scm_apply_0 (proc, scm_list_1 (self_scm ()));