X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=2a1038941b8e630904c2f4abce75174991f966c4;hb=85902ccc9c481c2f992676ecff060e05caffef8f;hp=211c24bd935a73d4c2dde9d9dafb82d0793dff52;hpb=1e1fa5221ca359326b073626168c6b7cda6453e1;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 211c24bd93..2a1038941b 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,33 +3,73 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ -#include - #include "book.hh" -#include "global-context.hh" -#include "ly-module.hh" + +#include +using namespace std; + #include "main.hh" -#include "music-iterator.hh" -#include "music-output.hh" #include "music.hh" #include "output-def.hh" #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 "page-marker.hh" #include "ly-smobs.icc" Book::Book () - : Input () { - bookpaper_ = 0; + paper_ = 0; header_ = SCM_EOL; - assert (!scores_.size ()); + 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 (); + paper_->unprotect (); + } + + 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 () @@ -42,13 +82,13 @@ 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 (book->bookpaper_) - scm_gc_mark (book->bookpaper_->self_scm ()); + if (book->paper_) + scm_gc_mark (book->paper_->self_scm ()); + scm_gc_mark (book->scores_); + scm_gc_mark (book->input_location_); + return book->header_; } @@ -59,73 +99,68 @@ Book::print_smob (SCM, SCM p, scm_print_state*) return 1; } -/* This function does not dump the output; outname is required eg. for - dumping header fields. */ +void +Book::add_score (SCM s) +{ + scores_ = scm_cons (s, scores_); +} + + +/* 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) { - bool error = false; - for (int i = 0; i < scores_.size(); i++) - error |= scores_[i]->error_found_; + 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; - if (error) + Output_def *paper = paper_ ? paper_ : default_paper; + if (!paper) return 0; - - Paper_book *paper_book = new Paper_book (); - Real scale = scm_to_double (bookpaper_->c_variable ("outputscale")); - Output_def * scaled_bookdef = scale_output_def (bookpaper_, scale); + Paper_book *paper_book = new Paper_book (); + Real scale = scm_to_double (paper->c_variable ("output-scale")); + Output_def *scaled_bookdef = scale_output_def (paper, scale); + + paper_book->paper_ = scaled_bookdef; + scaled_bookdef->unprotect (); - paper_book->bookpaper_ = scaled_bookdef; - 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. */ + for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) { - SCM systems = scores_[i]->book_rendering (outname, - paper_book->bookpaper_, - default_def); - - /* 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_; - paper_book->score_systems_.push (sc); + SCM outputs = score + ->book_rendering (paper_book->paper_, default_layout); + + 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)) + { + if (ly_is_module (score->header_)) + paper_book->add_score (score->header_); + paper_book->add_score (pscore->self_scm ()); + } + + outputs = scm_cdr (outputs); + } } + else if (Text_interface::is_markup_list (scm_car (s)) + || unsmob_page_marker (scm_car (s))) + paper_book->add_score (scm_car (s)); + else + assert (0); } return paper_book; } -LY_DEFINE(ly_make_book, "ly:make-book", - 2, 0, 1, (SCM bookpaper, SCM header, SCM scores), - "Make a \\book of @var{bookpaper} and @var{header} (which may be #f as well) " - "containing @code{\\scores}.") -{ - Output_def * odef = unsmob_output_def (bookpaper); - SCM_ASSERT_TYPE (odef, bookpaper, - SCM_ARG1, __FUNCTION__, "Output_def"); - - Book *book = new Book; - book->bookpaper_ = odef; - - if (ly_c_module_p (header)) - book->header_ = header; - - for (SCM s = scores; scm_is_pair (s); s = scm_cdr (s)) - { - Score *score = unsmob_score (scm_car (s)); - if (score) - book->scores_.push (score); - } - - SCM x = book->self_scm (); - scm_gc_unprotect_object (x); - return x; -} -