X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=f007e6263077f88a1e108856f4bc5c38eae98c64;hb=8a099812dc626f36699fbef0dba05901ac0315b7;hp=4d764f3be35865d6e4971366b8111d0613f44032;hpb=b01113ffaeec02548a79f02f2d389c2292815200;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 4d764f3be3..f007e62630 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -9,6 +9,7 @@ #include "book.hh" #include +using namespace std; #include "lilypond-key.hh" #include "global-context.hh" @@ -20,9 +21,12 @@ #include "paper-book.hh" #include "score.hh" #include "stencil.hh" -#include "text-item.hh" +#include "text-interface.hh" #include "warn.hh" +#include "performance.hh" +#include "paper-score.hh" + #include "ly-smobs.icc" Book::Book () @@ -44,11 +48,11 @@ IMPLEMENT_DEFAULT_EQUAL_P (Book); SCM Book::mark_smob (SCM s) { - Book *book = (Book*) SCM_CELL_WORD_1 (s); + Book *book = (Book *) SCM_CELL_WORD_1 (s); #if 0 if (book->key_) - scm_gc_mark (book->key_->self_scm()); + scm_gc_mark (book->key_->self_scm ()); #endif if (book->paper_) @@ -71,27 +75,31 @@ Book::add_score (SCM s) scores_ = scm_cons (s, scores_); } -/* This function does not dump the output; outname is required eg. for - dumping header fields. */ +/* Concatenate all score outputs into a Paper_book + */ Paper_book * -Book::process (String outname, Output_def *default_def) +Book::process (Output_def *default_paper, + Output_def *default_layout) { for (SCM s = scores_; s != SCM_EOL; s = scm_cdr (s)) if (Score *score = unsmob_score (scm_car (s))) if (score->error_found_) return 0; + Output_def *paper = paper_ ? default_paper : paper_; + if (!paper) + return 0; + Paper_book *paper_book = new Paper_book (); - Real scale = scm_to_double (paper_->c_variable ("outputscale")); - Output_def * scaled_bookdef = scale_output_def (paper_, scale); + Real scale = scm_to_double (paper->c_variable ("outputscale")); + Output_def *scaled_bookdef = scale_output_def (paper, scale); + + Object_key *key = new Lilypond_general_key (0, user_key_, 0); + SCM scm_key = key->unprotect (); - Object_key * key = new Lilypond_general_key (0, user_key_, 0); - SCM scm_key = key->self_scm(); - scm_gc_unprotect_object (scm_key); - paper_book->paper_ = scaled_bookdef; - scm_gc_unprotect_object (scaled_bookdef->self_scm()); - + scaled_bookdef->unprotect (); + paper_book->header_ = header_; /* Render in order of parsing. */ @@ -99,19 +107,27 @@ Book::process (String outname, Output_def *default_def) { if (Score *score = unsmob_score (scm_car (s))) { - SCM systems = score - ->book_rendering (outname, paper_book->paper_, default_def, key); - - /* If the score is empty, generate no output. Should we do - titling? */ - if (scm_is_vector (systems)) + SCM outputs = score + ->book_rendering (paper_book->paper_, default_layout, key); + + while (scm_is_pair (outputs)) { - if (ly_c_module_p (score->header_)) - paper_book->add_score (score->header_); - paper_book->add_score (systems); + Music_output *output = unsmob_music_output (scm_car (outputs)); + + if (Performance *perf = dynamic_cast (output)) + paper_book->add_performance (perf->self_scm ()); + else if (Paper_score *pscore = dynamic_cast (output)) + { + SCM systems = pscore->get_paper_systems (); + if (ly_is_module (score->header_)) + paper_book->add_score (score->header_); + paper_book->add_score (systems); + } + + outputs = scm_cdr (outputs); } } - else if (Text_interface::markup_p (scm_car (s))) + else if (Text_interface::is_markup (scm_car (s))) paper_book->add_score (scm_car (s)); else assert (0);