X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=fd519d5d751fee66e7af54d84a8f14b989c40e04;hb=2e9a5ee154d49c0a754f908f024f5423a342ab8f;hp=dfd3f6257fa64f9d68d52332095d61564a1109e8;hpb=1a202d714289de5cbab27fa18477e9e1968733d6;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index dfd3f6257f..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" @@ -32,6 +33,7 @@ Paper_book::Paper_book () systems_ = SCM_BOOL_F; paper_ = 0; + parent_ = 0; smobify_self (); } @@ -49,6 +51,8 @@ Paper_book::mark_smob (SCM smob) Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); if (b->paper_) scm_gc_mark (b->paper_->self_scm ()); + if (b->parent_) + scm_gc_mark (b->parent_->self_scm ()); scm_gc_mark (b->header_); scm_gc_mark (b->header_0_); scm_gc_mark (b->pages_); @@ -107,56 +111,60 @@ Paper_book::add_performance (SCM s) int Paper_book::output_aux (SCM output_channel, - int first_page_number, - bool is_first, - bool is_last) + 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"); - scm_call_2 (proc, performances (), output_channel); + scm_call_3 (proc, + performances (), + output_channel, + scm_long2num (*first_performance_number)); + *first_performance_number += scm_ilength (performances_); } if (scm_is_pair (bookparts_)) { - bool is_first_part = is_first; - int page_number = first_page_number; - for (SCM p = scm_reverse (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))); - page_number += pbookpart->output_aux (output_channel, - page_number, - is_first_part, - is_last_part); - is_first_part = false; - } - return page_number; + 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))); + page_nb += pbookpart->output_aux (output_channel, + is_last_part, + first_page_number, + first_performance_number); + } } else { if (scores_ == SCM_EOL) - return 0; - paper_->set_variable (ly_symbol2scm ("part-first-page-number"), - scm_long2num (first_page_number)); - paper_->set_variable (ly_symbol2scm ("part-is-first"), - ly_bool2scm (is_first)); - paper_->set_variable (ly_symbol2scm ("part-is-last"), - ly_bool2scm (is_last)); + return 0; + paper_->set_variable (ly_symbol2scm ("first-page-number"), + scm_long2num (*first_page_number)); + paper_->set_variable (ly_symbol2scm ("is-last-bookpart"), + ly_bool2scm (is_last)); /* Generate all stencils to trigger font loads. */ - return scm_ilength (pages ()); + page_nb = scm_ilength (pages ()); + *first_page_number += page_nb; } + return page_nb; } void Paper_book::output (SCM output_channel) { - output_aux (output_channel, - robust_scm2int (paper_->c_variable ("first-page-number"), 1), - true, - true); - + int first_page_number = robust_scm2int (paper_->c_variable ("first-page-number"), 1); + int first_performance_number = 0; + 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); @@ -167,36 +175,53 @@ 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 ())); } } void -Paper_book::classic_output_aux (SCM output) +Paper_book::classic_output_aux (SCM output, + int *first_performance_number) { if (scm_is_pair (performances_)) { SCM proc = ly_lily_module_constant ("write-performances-midis"); - - scm_call_2 (proc, performances (), output); + scm_call_3 (proc, + performances (), + output, + scm_long2num (*first_performance_number)); + *first_performance_number += scm_ilength (performances_); } /* Generate all stencils to trigger font loads. */ @@ -206,7 +231,8 @@ Paper_book::classic_output_aux (SCM output) void Paper_book::classic_output (SCM output) { - classic_output_aux (output); + int first_performance_number = 0; + classic_output_aux (output, &first_performance_number); SCM scopes = SCM_EOL; if (ly_is_module (header_)) @@ -509,52 +535,52 @@ 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)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) - systems_ = scm_append_x (scm_list_2 (systems_, pbookpart->systems ())); + 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 ())); } else { SCM specs = get_system_specs (); for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s)) - { - if (Paper_score *pscore = dynamic_cast (unsmob_music_output (scm_car (s)))) - { - SCM system_list = scm_vector_to_list (pscore->get_paper_systems ()); - system_list = scm_reverse (system_list); - systems_ = scm_append (scm_list_2 (system_list, systems_)); - } - else - { - systems_ = scm_cons (scm_car (s), systems_); - } - } + { + if (Paper_score *pscore = dynamic_cast (unsmob_music_output (scm_car (s)))) + { + SCM system_list = scm_vector_to_list (pscore->get_paper_systems ()); + system_list = scm_reverse (system_list); + systems_ = scm_append (scm_list_2 (system_list, systems_)); + } + else + { + systems_ = scm_cons (scm_car (s), systems_); + } + } systems_ = scm_reverse (systems_); /* backwards compatibility for the old page breaker */ int i = 0; Prob *last = 0; for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s)) - { - Prob *ps = unsmob_prob (scm_car (s)); - ps->set_property ("number", scm_from_int (++i)); - - if (last - && to_boolean (last->get_property ("is-title")) - && !scm_is_number (ps->get_property ("penalty"))) - ps->set_property ("penalty", scm_from_int (10000)); - last = ps; - - if (scm_is_pair (scm_cdr (s))) - { - SCM perm = ps->get_property ("page-break-permission"); - Prob *next = unsmob_prob (scm_cadr (s)); - if (perm == SCM_EOL) - next->set_property ("penalty", scm_from_int (10001)); - else if (perm == ly_symbol2scm ("force")) - next->set_property ("penalty", scm_from_int (-10001)); - } - } + { + Prob *ps = unsmob_prob (scm_car (s)); + ps->set_property ("number", scm_from_int (++i)); + + if (last + && to_boolean (last->get_property ("is-title")) + && !scm_is_number (ps->get_property ("penalty"))) + ps->set_property ("penalty", scm_from_int (10000)); + last = ps; + + if (scm_is_pair (scm_cdr (s))) + { + SCM perm = ps->get_property ("page-break-permission"); + Prob *next = unsmob_prob (scm_cadr (s)); + if (perm == SCM_EOL) + next->set_property ("penalty", scm_from_int (10001)); + else if (perm == ly_symbol2scm ("force")) + next->set_property ("penalty", scm_from_int (-10001)); + } + } } return systems_; @@ -569,26 +595,26 @@ 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)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) - pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ())); + 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 ())); /* set systems_ from the pages */ if (systems_ == SCM_BOOL_F) - { - systems_ = SCM_EOL; - for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p)) - { - Prob *page = unsmob_prob (scm_car (p)); - SCM systems = page->get_property ("lines"); - systems_ = scm_append (scm_list_2 (systems_, systems)); - } - } + { + systems_ = SCM_EOL; + for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p)) + { + Prob *page = unsmob_prob (scm_car (p)); + SCM systems = page->get_property ("lines"); + systems_ = scm_append (scm_list_2 (systems_, systems)); + } + } } return pages_; }