X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=c7f5dd02378372ba377320d9c1a94dec2899d17b;hb=750b714488c5af6eae22d07163bba8b554734ac6;hp=e76963eaf30fb140d2bdf68a6104b6ebcb62f1c2;hpb=90d3233da87b372e02690978f89b2add3863fba6;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index e76963eaf3..c7f5dd0237 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -32,8 +32,7 @@ using namespace std; #include "performance.hh" #include "paper-score.hh" #include "page-marker.hh" - -ADD_SMOB_INIT (Book); +#include "ly-module.hh" Book::Book () { @@ -73,9 +72,9 @@ Book::Book (Book const &s) { SCM entry = scm_car (p); - if (Score *newscore = Score::unsmob (entry)) + if (Score *newscore = unsmob (entry)) * t = scm_cons (newscore->clone ()->unprotect (), SCM_EOL); - else if (Page_marker *marker = Page_marker::unsmob (entry)) + else if (Page_marker *marker = unsmob (entry)) * t = scm_cons (marker->clone ()->unprotect (), SCM_EOL); else { @@ -88,7 +87,7 @@ Book::Book (Book const &s) t = &bookparts_; for (SCM p = s.bookparts_; scm_is_pair (p); p = scm_cdr (p)) { - Book *newpart = Book::unsmob (scm_car (p))->clone (); + Book *newpart = unsmob (scm_car (p))->clone (); *t = scm_cons (newpart->self_scm (), SCM_EOL); t = SCM_CDRLOC (*t); @@ -99,7 +98,7 @@ Book::Book (Book const &s) Input * Book::origin () const { - return Input::unsmob (input_location_); + return unsmob (input_location_); } Book::~Book () @@ -108,7 +107,7 @@ Book::~Book () SCM -Book::mark_smob () +Book::mark_smob () const { if (paper_) scm_gc_mark (paper_->self_scm ()); @@ -169,7 +168,7 @@ void Book::add_bookpart (SCM b) { add_scores_to_bookpart (); - Book *part = Book::unsmob (b); + Book *part = unsmob (b); part->set_parent (this); bookparts_ = scm_cons (b, bookparts_); } @@ -178,12 +177,12 @@ bool Book::error_found () { for (SCM s = scores_; scm_is_pair (s); s = scm_cdr (s)) - if (Score *score = Score::unsmob (scm_car (s))) + if (Score *score = unsmob (scm_car (s))) if (score->error_found_) return true; for (SCM part = bookparts_; scm_is_pair (part); part = scm_cdr (part)) - if (Book *bookpart = Book::unsmob (scm_car (part))) + if (Book *bookpart = unsmob (scm_car (part))) if (bookpart->error_found ()) return true; @@ -203,7 +202,7 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu add_scores_to_bookpart (); for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) { - if (Book *book = Book::unsmob (scm_car (p))) + if (Book *book = unsmob (scm_car (p))) { Paper_book *paper_book_part = book->process (paper, layout, output_paper_book); if (paper_book_part) @@ -220,17 +219,28 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu void Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) { - if (Score *score = Score::unsmob (scm_car (s))) + if (Score *score = unsmob (scm_car (s))) { SCM outputs = score ->book_rendering (output_paper_book->paper_, layout); while (scm_is_pair (outputs)) { - Music_output *output = Music_output::unsmob (scm_car (outputs)); + Music_output *output = unsmob (scm_car (outputs)); if (Performance *perf = dynamic_cast (output)) - output_paper_book->add_performance (perf->self_scm ()); + { + output_paper_book->add_performance (perf->self_scm ()); + // Associate the performance with a \header block (if there is + // one in effect in the scope of the current score), to make the + // header metadata accessible when outputting the performance. + if (ly_is_module (score->get_header ())) + perf->set_header (score->get_header ()); + else if (ly_is_module (output_paper_book->header_)) + perf->set_header (output_paper_book->header_); + else if (ly_is_module (output_paper_book->header_0_)) + perf->set_header (output_paper_book->header_0_); + } else if (Paper_score *pscore = dynamic_cast (output)) { if (ly_is_module (score->get_header ())) @@ -242,7 +252,7 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) } } else if (Text_interface::is_markup_list (scm_car (s)) - || Page_marker::is_smob (scm_car (s))) + || unsmob (scm_car (s))) output_paper_book->add_score (scm_car (s)); else assert (0);