X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=87df4efe841e33cf9b7d9317b7df960cb112aadb;hb=e03b2923c10e1c33238a4f2ecf78714bf829e758;hp=e0388c00c38bb42be06372bf8eedad14dc78f5ce;hpb=813ef8712c3026794399ff1425a245ffe075efaf;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index e0388c00c3..87df4efe84 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,12 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "book.hh" #include +using namespace std; #include "lilypond-key.hh" #include "global-context.hh" @@ -20,7 +21,7 @@ #include "paper-book.hh" #include "score.hh" #include "stencil.hh" -#include "text-item.hh" +#include "text-interface.hh" #include "warn.hh" #include "performance.hh" @@ -37,6 +38,12 @@ Book::Book () smobify_self (); } +Book* +Book::clone () const +{ + return new Book (*this); +} + Book::~Book () { } @@ -74,63 +81,59 @@ 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_ ? paper_ : default_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 ("output-scale")); + 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 (); - scm_gc_unprotect_object (scm_key); + SCM scm_key = key->unprotect (); 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. */ - int midi_count = 0; for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) { if (Score *score = unsmob_score (scm_car (s))) { SCM outputs = score - ->book_rendering (paper_book->paper_, default_def, key); + ->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)) { - 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_systems (); - if (ly_c_module_p (score->header_)) + if (ly_is_module (score->header_)) paper_book->add_score (score->header_); - paper_book->add_score (systems); + paper_book->add_score (pscore->self_scm ()); } - + 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); @@ -139,3 +142,4 @@ Book::process (String outname, Output_def *default_def) scm_remember_upto_here_1 (scm_key); return paper_book; } +