X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=069fca16fdffd7dda201455d363e075caeca071b;hb=c6554467b0a9beddf0d7ef12746ae31a25fe36e7;hp=43e2012043a8fd48ef10fb65c2e40ee0b9d4db28;hpb=dbefd4b8d0249c6a739d09118f3e0a71001c1c52;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 43e2012043..069fca16fd 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -32,6 +32,7 @@ Paper_book::Paper_book () systems_ = SCM_BOOL_F; paper_ = 0; + parent_ = 0; smobify_self (); } @@ -49,6 +50,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_); @@ -105,57 +108,57 @@ Paper_book::add_performance (SCM s) performances_ = scm_cons (s, performances_); } -int +void 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) { 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; + 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); + } } 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; + 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 ()); + *first_page_number += scm_ilength (pages ()); } } void 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, - robust_scm2int (paper_->c_variable ("first-page-number"), 1), - true, - true); + true, + &first_page_number, + &first_performance_number); SCM scopes = SCM_EOL; if (ly_is_module (header_)) @@ -190,13 +193,17 @@ Paper_book::output (SCM output_channel) } 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 +213,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_)) @@ -381,18 +389,15 @@ Paper_book::get_system_specs () { SCM system_specs = SCM_EOL; - if (ly_scm2bool (paper_->c_variable ("part-is-first"))) + Stencil title = book_title (); + if (!title.is_empty ()) { - Stencil title = book_title (); - if (!title.is_empty ()) - { - SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties")); - Prob *ps = make_paper_system (props); - paper_system_set_stencil (ps, title); - - system_specs = scm_cons (ps->self_scm (), system_specs); - ps->unprotect (); - } + SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties")); + Prob *ps = make_paper_system (props); + paper_system_set_stencil (ps, title); + + system_specs = scm_cons (ps->self_scm (), system_specs); + ps->unprotect (); } SCM page_properties @@ -513,51 +518,51 @@ Paper_book::systems () 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 ())); + 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_; @@ -573,8 +578,8 @@ Paper_book::pages () 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 ())); + if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) + pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ())); } else { @@ -583,15 +588,15 @@ Paper_book::pages () /* 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_; }