X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=f307bcf3c31c830a1523f29788c828c71ef6bece;hb=3ee0df13c3fe001cef0bef15adcbadfb2c394fd8;hp=28bdb6d5e84a8af8c43033fafb0986127963eff3;hpb=545092a25d8ca41dc90b87482474b3719f7130a9;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 28bdb6d5e8..f307bcf3c3 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "book.hh" @@ -12,9 +12,7 @@ using namespace std; #include "lilypond-key.hh" -#include "global-context.hh" #include "main.hh" -#include "music-iterator.hh" #include "music-output.hh" #include "music.hh" #include "output-def.hh" @@ -23,19 +21,53 @@ using namespace std; #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; + input_location_ = SCM_EOL; smobify_self (); + + input_location_ = make_input (Input ()); +} + +Book::Book (Book const &s) +{ + paper_ = 0; + header_ = SCM_EOL; + scores_ = SCM_EOL; + input_location_ = SCM_EOL; + smobify_self (); + + if (s.paper_) + paper_ = s.paper_->clone (); + + input_location_ = make_input (*s.origin ()); + header_ = ly_make_anonymous_module (false); + if (ly_is_module (s.header_)) + ly_module_copy (header_, s.header_); + + SCM *t = &scores_; + for (SCM p = s.scores_; scm_is_pair (p); p = scm_cdr (p)) + { + Score *newscore = unsmob_score (scm_car (p))->clone (); + + *t = scm_cons (newscore->self_scm (), SCM_EOL); + t = SCM_CDRLOC(*t); + newscore->unprotect (); + } +} + +Input * +Book::origin () const +{ + return unsmob_input (input_location_); } Book::~Book () @@ -58,7 +90,8 @@ Book::mark_smob (SCM s) if (book->paper_) scm_gc_mark (book->paper_->self_scm ()); scm_gc_mark (book->scores_); - + scm_gc_mark (book->input_location_); + return book->header_; } @@ -75,13 +108,14 @@ 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)) + for (SCM s = scores_; scm_is_pair (s); s = scm_cdr (s)) if (Score *score = unsmob_score (scm_car (s))) if (score->error_found_) return 0; @@ -91,7 +125,7 @@ Book::process (Output_def *default_paper, return 0; Paper_book *paper_book = new Paper_book (); - Real scale = scm_to_double (paper->c_variable ("outputscale")); + 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); @@ -103,7 +137,7 @@ Book::process (Output_def *default_paper, paper_book->header_ = header_; /* Render in order of parsing. */ - for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) + for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) { if (Score *score = unsmob_score (scm_car (s))) { @@ -118,10 +152,9 @@ Book::process (Output_def *default_paper, 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); + paper_book->add_score (pscore->self_scm ()); } outputs = scm_cdr (outputs); @@ -136,3 +169,4 @@ Book::process (Output_def *default_paper, scm_remember_upto_here_1 (scm_key); return paper_book; } +