X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=c7f5dd02378372ba377320d9c1a94dec2899d17b;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=5ec33e7b9ac07f2b1ab706cc3bd86d1c8312685c;hpb=bb8a0a5387af94dd2702877256334b160575a730;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 5ec33e7b9a..c7f5dd0237 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,8 +32,7 @@ using namespace std; #include "performance.hh" #include "paper-score.hh" #include "page-marker.hh" - -#include "ly-smobs.icc" +#include "ly-module.hh" Book::Book () { @@ -44,10 +43,11 @@ Book::Book () input_location_ = SCM_EOL; smobify_self (); - input_location_ = make_input (Input ()); + input_location_ = Input ().smobbed_copy (); } Book::Book (Book const &s) + : Smob () { paper_ = 0; header_ = SCM_EOL; @@ -62,7 +62,7 @@ Book::Book (Book const &s) paper_->unprotect (); } - input_location_ = make_input (*s.origin ()); + input_location_ = s.origin ()->smobbed_copy (); header_ = ly_make_module (false); if (ly_is_module (s.header_)) @@ -72,9 +72,9 @@ Book::Book (Book const &s) { SCM entry = scm_car (p); - if (Score *newscore = unsmob_score (entry)) + if (Score *newscore = unsmob (entry)) * t = scm_cons (newscore->clone ()->unprotect (), SCM_EOL); - else if (Page_marker *marker = unsmob_page_marker (entry)) + else if (Page_marker *marker = unsmob (entry)) * t = scm_cons (marker->clone ()->unprotect (), SCM_EOL); else { @@ -87,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 = unsmob_book (scm_car (p))->clone (); + Book *newpart = unsmob (scm_car (p))->clone (); *t = scm_cons (newpart->self_scm (), SCM_EOL); t = SCM_CDRLOC (*t); @@ -98,35 +98,24 @@ Book::Book (Book const &s) Input * Book::origin () const { - return unsmob_input (input_location_); + return unsmob (input_location_); } Book::~Book () { } -IMPLEMENT_SMOBS (Book); -IMPLEMENT_DEFAULT_EQUAL_P (Book); SCM -Book::mark_smob (SCM s) +Book::mark_smob () const { - Book *book = (Book *) SCM_CELL_WORD_1 (s); - - if (book->paper_) - scm_gc_mark (book->paper_->self_scm ()); - scm_gc_mark (book->scores_); - scm_gc_mark (book->bookparts_); - scm_gc_mark (book->input_location_); - - return book->header_; -} + if (paper_) + scm_gc_mark (paper_->self_scm ()); + scm_gc_mark (scores_); + scm_gc_mark (bookparts_); + scm_gc_mark (input_location_); -int -Book::print_smob (SCM, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; + return header_; } void @@ -179,7 +168,7 @@ void Book::add_bookpart (SCM b) { add_scores_to_bookpart (); - Book *part = unsmob_book (b); + Book *part = unsmob (b); part->set_parent (this); bookparts_ = scm_cons (b, bookparts_); } @@ -188,12 +177,12 @@ bool Book::error_found () { for (SCM s = scores_; scm_is_pair (s); s = scm_cdr (s)) - if (Score *score = unsmob_score (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 = unsmob_book (scm_car (part))) + if (Book *bookpart = unsmob (scm_car (part))) if (bookpart->error_found ()) return true; @@ -213,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 = unsmob_book (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) @@ -230,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 = unsmob_score (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 = unsmob_music_output (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 ())) @@ -252,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)) - || unsmob_page_marker (scm_car (s))) + || unsmob (scm_car (s))) output_paper_book->add_score (scm_car (s)); else assert (0);