X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=7e3d29b77827cb9f772f61df521be4c194a713e9;hb=dbf55d6ee960e31cd339e25d7d75439279be503f;hp=5159c117b4a8a11ce38cc90920d73353885b1275;hpb=61bba8a98a53e424054b26d63ead26b0696ea29d;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 5159c117b4..7e3d29b778 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,14 +3,15 @@ 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 + +#include "lilypond-key.hh" #include "global-context.hh" -#include "ly-module.hh" #include "main.hh" #include "music-iterator.hh" #include "music-output.hh" @@ -19,14 +20,17 @@ #include "paper-book.hh" #include "score.hh" #include "stencil.hh" +#include "text-item.hh" #include "warn.hh" +#include "ly-smobs.icc" + Book::Book () : Input () { - bookpaper_ = 0; + paper_ = 0; header_ = SCM_EOL; - assert (!scores_.size ()); + scores_ = SCM_EOL; smobify_self (); } @@ -34,20 +38,23 @@ Book::~Book () { } -#include "ly-smobs.icc" IMPLEMENT_SMOBS (Book); 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_); - if (book->bookpaper_) - scm_gc_mark (book->bookpaper_->self_scm ()); return book->header_; } @@ -58,64 +65,58 @@ 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) { + 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; + Paper_book *paper_book = new Paper_book (); - Real scale = ly_scm2double (bookpaper_->c_variable ("outputscale")); - - Output_def * scaled_bookdef = scale_output_def (bookpaper_, 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 (); + scm_gc_unprotect_object (scm_key); + + paper_book->paper_ = scaled_bookdef; + scm_gc_unprotect_object (scaled_bookdef->self_scm ()); - 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_); s != SCM_EOL; 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 (systems != SCM_EOL - /* FIXME: can systems be SCM_UNDEFINED at all? - it seesm to be initialise with SCM_EOL and only gets assigned - non-SCM_UNDEFINED values -- jcn */ - && systems != SCM_UNDEFINED) + if (Score *score = unsmob_score (scm_car (s))) { - Score_lines sc; - sc.lines_ = systems; - sc.header_ = header_; - paper_book->score_lines_.push (sc); + SCM systems = score + ->book_rendering (outname, paper_book->paper_, default_def, key); + + /* If the score is empty, generate no output. Should we do + titling? */ + if (scm_is_vector (systems)) + { + if (ly_c_module_p (score->header_)) + paper_book->add_score (score->header_); + paper_book->add_score (systems); + } } + 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; } - -#if 0 -/* FIXME: WIP, this is a hack. Return first page as stencil. */ -SCM -Book::to_stencil (Output_def *default_def) -{ - Paper_book *paper_book = process ("", default_def); - - SCM pages = paper_book->pages (); - scm_gc_unprotect_object (paper_book->self_scm ()); - - if (ly_c_pair_p (pages)) - { - progress_indication (_f ("paper output to `%s'...", "")); - return ly_car (pages); - } - - scm_gc_unprotect_object (paper_book->bookpaper_->self_scm ()); - - return SCM_EOL; -} -#endif