X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=e8d0252b2158da5347a26fbf09011f1970c02b67;hb=98917430c66cf99c9ac706003056396b890319ff;hp=c6a4ddd5241a2b78e775a315e3cb8a1c1bb9b4c3;hpb=95710e75ffe837a9535937fcbc9a7a0cdeec22f3;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index c6a4ddd524..e8d0252b21 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,52 +3,46 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ -#include +#include "book.hh" -#include "ly-smobs.icc" +#include +using namespace std; -#include "book.hh" +#include "lilypond-key.hh" #include "global-context.hh" -#include "ly-module.hh" -#include "input-file-results.hh" #include "main.hh" #include "music-iterator.hh" -#include "music-output-def.hh" #include "music-output.hh" #include "music.hh" +#include "output-def.hh" #include "paper-book.hh" -#include "paper-def.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 () : Input () { + paper_ = 0; header_ = SCM_EOL; + scores_ = SCM_EOL; smobify_self (); } -#if 0 -Book::Book (Book const &src) - : Input (src) +Book* +Book::clone () const { - header_ = SCM_EOL; - smobify_self (); - - int score_count = src.scores_.size (); - for (int i = 0; i < score_count; i++) - scores_.push (src.scores_[i]->clone ()); - -#if 0 - header_ = ly_make_anonymous_module (); - if (is_module (src.header_)) - ly_import_module (header_, src.header_); -#endif + return new Book (*this); } -#endif Book::~Book () { @@ -60,10 +54,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 ()); +#endif + + if (book->paper_) + scm_gc_mark (book->paper_->self_scm ()); + scm_gc_mark (book->scores_); + return book->header_; } @@ -75,24 +76,70 @@ Book::print_smob (SCM, SCM p, scm_print_state*) } void -Book::process (String outname, Music_output_def *default_def, SCM header) +Book::add_score (SCM s) +{ + scores_ = scm_cons (s, scores_); +} + +/* Concatenate all score outputs into a Paper_book + */ +Paper_book * +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_ ? paper_ : default_paper; + if (!paper) + return 0; + Paper_book *paper_book = new Paper_book (); - int score_count = scores_.size (); - for (int i = 0; i < score_count; i++) + 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 (); + + paper_book->paper_ = scaled_bookdef; + scaled_bookdef->unprotect (); + + paper_book->header_ = header_; + + /* Render in order of parsing. */ + for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) { - Paper_def *paper = 0; - SCM systems = scores_[i]->book_rendering (outname, default_def, &paper); - if (systems != SCM_UNDEFINED) + if (Score *score = unsmob_score (scm_car (s))) { - if (paper) - paper_book->papers_.push (paper); - paper_book->scores_.push (systems); - paper_book->global_headers_.push (global_input_file->header_); - //paper_book->headers_.push (scores_[i]->header_); - paper_book->headers_.push (header); + 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)) + 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::is_markup (scm_car (s))) + paper_book->add_score (scm_car (s)); + else + assert (0); } - paper_book->output (outname); - scm_gc_unprotect_object (paper_book->self_scm ()); + + scm_remember_upto_here_1 (scm_key); + return paper_book; } +