X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=59c9c206afb1b91478641f17f2463b2a02a9ece9;hb=6ddd5b9373861e63801b29b336580621ca4b9ef1;hp=d15233f70c5ac04eab8c0f1f84b90f15b1003b7c;hpb=0d6207e894224577f9879f4036ef8cab4925c4c7;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index d15233f70c..59c9c206af 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -6,10 +6,10 @@ (c) 1997--2005 Han-Wen Nienhuys */ +#include "book.hh" #include -#include "book.hh" #include "lilypond-key.hh" #include "global-context.hh" #include "main.hh" @@ -20,8 +20,12 @@ #include "paper-book.hh" #include "score.hh" #include "stencil.hh" +#include "text-interface.hh" #include "warn.hh" +#include "performance.hh" +#include "paper-score.hh" + #include "ly-smobs.icc" Book::Book () @@ -29,7 +33,7 @@ Book::Book () { paper_ = 0; header_ = SCM_EOL; - assert (!scores_.size ()); + scores_ = SCM_EOL; smobify_self (); } @@ -43,17 +47,17 @@ IMPLEMENT_DEFAULT_EQUAL_P (Book); SCM Book::mark_smob (SCM s) { - Book *book = (Book*) SCM_CELL_WORD_1 (s); - int score_count = book->scores_.size (); - for (int i = 0; i < score_count; i++) - scm_gc_mark (book->scores_[i]->self_scm ()); + 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_) scm_gc_mark (book->paper_->self_scm ()); + scm_gc_mark (book->scores_); + return book->header_; } @@ -64,65 +68,78 @@ Book::print_smob (SCM, SCM p, scm_print_state*) return 1; } +void +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. */ Paper_book * -Book::process (String outname, Output_def *default_def) +Book::process (String outname, + Output_def *default_paper, + Output_def *default_layout) { - bool error = false; - for (int i = 0; i < scores_.size(); i++) - error = error || scores_[i]->error_found_; - - if (error) - return 0; + 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_; + 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->self_scm(); + 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()); - + scm_gc_unprotect_object (scaled_bookdef->self_scm ()); + paper_book->header_ = header_; - int score_count = scores_.size (); - for (int i = 0; i < score_count; i++) + + /* Render in order of parsing. */ + int midi_count = 0; + for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) { - SCM systems = scores_[i]->book_rendering (outname, - paper_book->paper_, - default_def, - key - ); - - /* - If the score is empty, generate no output. Should we - do titling? - */ - if (SCM_NFALSEP(scm_vector_p (systems))) + if (Score *score = unsmob_score (scm_car (s))) { - Score_systems sc; - sc.systems_ = systems; - sc.header_ = scores_[i]->header_; - sc.texts_ = scores_[i]->texts_; - paper_book->score_systems_.push (sc); + SCM outputs = score + ->book_rendering (paper_book->paper_, default_layout, key); + + while (scm_is_pair (outputs)) + { + Music_output *output = unsmob_music_output (scm_car (outputs)); + + if (Performance *perf = dynamic_cast (output)) + { + String fn = outname; + if (midi_count) + fn += "-" + to_string (midi_count); + + midi_count ++; + perf->write_output (fn); + } + 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))) + paper_book->add_score (scm_car (s)); + else + assert (0); } - scm_remember_upto_here_1 (scm_key); return paper_book; } - - - - -void -Book::add_score (Score *s) -{ - scores_.push (s); - scm_gc_unprotect_object (s->self_scm ()); -}