X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=0eff1b511710ad0cdc2af80a39b9d7e0926c2f9d;hb=11399666c290e5974a2b0a4db954c8928d0e28e2;hp=8ff6521d7753033f27023653ddba423553e2a7d0;hpb=e2f5ba92300dc3fb7517165ac224e1500ad850dd;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 8ff6521d77..0eff1b5117 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -8,23 +8,21 @@ #include -#include "book-paper-def.hh" -#include "ly-smobs.icc" -#include "stencil.hh" #include "book.hh" #include "global-context.hh" #include "ly-module.hh" #include "main.hh" #include "music-iterator.hh" -#include "music-output-def.hh" #include "music-output.hh" #include "music.hh" -#include "page.hh" +#include "output-def.hh" #include "paper-book.hh" -#include "paper-def.hh" #include "score.hh" +#include "stencil.hh" #include "warn.hh" +#include "ly-smobs.icc" + Book::Book () : Input () { @@ -61,65 +59,66 @@ Book::print_smob (SCM, SCM p, scm_print_state*) return 1; } -void -Book::process (String outname, Music_output_def *default_def, SCM header) +/* 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) { Paper_book *paper_book = new Paper_book (); - paper_book->bookpaper_ = bookpaper_; + Real scale = scm_to_double (bookpaper_->c_variable ("outputscale")); + + Output_def * scaled_bookdef = scale_output_def (bookpaper_, scale); + + 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++) { - Paper_def *paper = 0; SCM systems = scores_[i]->book_rendering (outname, - bookpaper_, - default_def, &paper); - if (systems != SCM_UNDEFINED) + paper_book->bookpaper_, + default_def); + + /* If the score is empty, generate no output. Should we + do titling? */ + if (SCM_NFALSEP(scm_vector_p (systems))) { - Score_lines sc; - sc.paper_ = paper; - 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); } } - paper_book->output (outname); - scm_gc_unprotect_object (paper_book->self_scm ()); + + return paper_book; } -/* FIXME: WIP, this is a hack. Return first page as stencil. */ -SCM -Book::to_stencil (Music_output_def *default_def, SCM header) +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}.") { - Paper_book *paper_book = new Paper_book (); - paper_book->bookpaper_ = bookpaper_; - int score_count = scores_.size (); - for (int i = 0; i < score_count; i++) - { - Paper_def *paper = 0; - SCM systems = scores_[i]->book_rendering ("", - bookpaper_, - default_def, - &paper); - if (systems != SCM_UNDEFINED) - { - Score_lines sc; - sc.paper_ = paper; - sc.lines_ = systems; - sc.header_ =header; - - paper_book->score_lines_.push (sc); + Output_def * odef = unsmob_output_def (bookpaper); + SCM_ASSERT_TYPE (odef, bookpaper, + SCM_ARG1, __FUNCTION__, "Output_def"); - // wtf: code dup. - } - } + Book *book = new Book; + book->bookpaper_ = odef; - SCM pages = paper_book->pages (); - paper_book = 0; - if (pages != SCM_EOL) + if (ly_c_module_p (header)) + book->header_ = header; + + for (SCM s = scores; ly_c_pair_p (s); s = ly_cdr (s)) { - progress_indication (_f ("paper output to `%s'...", "")); - return (unsmob_page (ly_car (pages)))->to_stencil ().smobbed_copy (); + Score *score = unsmob_score (ly_car (s)); + if (score) + book->scores_.push (score); } - return SCM_EOL; + + SCM x = book->self_scm (); + scm_gc_unprotect_object (x); + return x; } +