X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=640600f6d3d29fd13c44ab94ca39cbb176bad45d;hb=6d10791f358dc637ee7d8858fb61f959f1262b3c;hp=789c368078296146403dae13fbfb559f13618e40;hpb=b6b22a6efc6fe2f84c0b4f7cc4aa3550316bc89a;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 789c368078..640600f6d3 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -8,27 +8,26 @@ #include - -#include "ly-smobs.icc" -#include "stencil.hh" +#include "lilypond-key.hh" #include "book.hh" #include "global-context.hh" #include "ly-module.hh" #include "main.hh" #include "music-iterator.hh" -#include "output-def.hh" #include "music-output.hh" #include "music.hh" -#include "page.hh" -#include "paper-book.hh" #include "output-def.hh" +#include "paper-book.hh" #include "score.hh" +#include "stencil.hh" #include "warn.hh" +#include "ly-smobs.icc" + Book::Book () : Input () { - bookpaper_ = 0; + paper_ = 0; header_ = SCM_EOL; assert (!scores_.size ()); smobify_self (); @@ -49,8 +48,12 @@ Book::mark_smob (SCM s) for (int i = 0; i < score_count; i++) scm_gc_mark (book->scores_[i]->self_scm ()); - if (book->bookpaper_) - scm_gc_mark (book->bookpaper_->self_scm ()); +#if 0 + if (book->key_) + scm_gc_mark (book->key_->self_scm()); +#endif + if (book->paper_) + scm_gc_mark (book->paper_->self_scm ()); return book->header_; } @@ -61,58 +64,89 @@ 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. - */ +/* 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) { + bool error = false; + for (int i = 0; i < scores_.size(); i++) + error = error || scores_[i]->error_found_; + + if (error) + 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); - paper_book->bookpaper_ = scaled_bookdef; + + 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->header_ = header_; - int score_count = scores_.size (); for (int i = 0; i < score_count; i++) { SCM systems = scores_[i]->book_rendering (outname, - paper_book->bookpaper_, - default_def); - if (systems != SCM_UNDEFINED) + paper_book->paper_, + default_def, + key + ); + + /* + If the score is empty, generate no output. Should we + do titling? + */ + if (SCM_NFALSEP(scm_vector_p (systems))) { - Score_lines sc; - sc.lines_ = systems; - sc.header_ = header_; - - paper_book->score_lines_.push (sc); + Score_systems sc; + sc.systems_ = systems; + sc.header_ = scores_[i]->header_; + paper_book->score_systems_.push (sc); } } + + scm_remember_upto_here_1 (scm_key); return paper_book; } -/* FIXME: WIP, this is a hack. Return first page as stencil. */ -SCM -Book::to_stencil (Output_def *default_def) +LY_DEFINE(ly_make_book, "ly:make-book", + 2, 0, 1, (SCM paper, SCM header, SCM scores), + "Make a \\book of @var{paper} and @var{header} (which may be #f as well) " + "containing @code{\\scores}.") { - Paper_book *paper_book = process ("", default_def); + Output_def * odef = unsmob_output_def (paper); + SCM_ASSERT_TYPE (odef, paper, + SCM_ARG1, __FUNCTION__, "Output_def"); - SCM pages = paper_book->pages (); - scm_gc_unprotect_object (paper_book->self_scm ()); + Book *book = new Book; + book->paper_ = odef; - if (pages != SCM_EOL) + if (ly_c_module_p (header)) + book->header_ = header; + + for (SCM s = scores; scm_is_pair (s); s = scm_cdr (s)) { - progress_indication (_f ("paper output to `%s'...", "")); - return (unsmob_page (ly_car (pages)))->to_stencil ().smobbed_copy (); + Score *score = unsmob_score (scm_car (s)); + if (score) + book->scores_.push (score); } - - scm_gc_unprotect_object (paper_book->bookpaper_->self_scm ()); - return SCM_EOL; + SCM x = book->self_scm (); + scm_gc_unprotect_object (x); + return x; +} + + +void +Book::add_score (Score *s) +{ + scores_.push (s); + scm_gc_unprotect_object (s->self_scm ()); }