X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=3a84865462e4795f618fa995a477dca33d92e558;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=700405f3142d6ff0cdd5c71cba1eda25f449fa78;hpb=dbefd4b8d0249c6a739d09118f3e0a71001c1c52;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 700405f314..3a84865462 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2007 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys */ #include "book.hh" @@ -127,17 +127,23 @@ Book::set_parent (Book *parent) paper_->unprotect (); } paper_->parent_ = parent->paper_; - - if (header_ == SCM_EOL) + /* If this part is the first child of parent, copy its header */ + if (ly_is_module (parent->header_) && (scm_is_null (parent->bookparts_))) { - header_ = ly_make_anonymous_module (false); - if (ly_is_module (parent->header_)) - ly_module_copy (header_, parent->header_); + SCM tmp_header = ly_make_anonymous_module (false); + ly_module_copy (tmp_header, parent->header_); + if (ly_is_module (header_)) + ly_module_copy (tmp_header, header_); + header_ = tmp_header; } } +/* Before an explicit \bookpart is encountered, scores are added to the book. + * But once a bookpart is added, the previous scores shall be collected into + * a new bookpart. + */ void -Book::add_bookpart () +Book::add_scores_to_bookpart () { if (scm_is_pair (scores_)) { @@ -155,7 +161,7 @@ Book::add_bookpart () void Book::add_bookpart (SCM b) { - add_bookpart (); + add_scores_to_bookpart (); Book *part = unsmob_book (b); part->set_parent (this); bookparts_ = scm_cons (b, bookparts_); @@ -172,7 +178,7 @@ Book::error_found () for (SCM part = bookparts_; scm_is_pair (part); part = scm_cdr (part)) if (Book *bookpart = unsmob_book (scm_car (part))) if (bookpart->error_found ()) - return true; + return true; return false; } @@ -184,17 +190,64 @@ Book::process (Output_def *default_paper, return process (default_paper, default_layout, 0); } +void +Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Output_def *layout) +{ + add_scores_to_bookpart (); + for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) + { + if (Book *book = unsmob_book (scm_car (p))) + { + Paper_book *paper_book_part = book->process (paper, layout, output_paper_book); + if (paper_book_part) + output_paper_book->add_bookpart (paper_book_part->self_scm ()); + } + } +} + +void +Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) +{ + if (Score *score = unsmob_score (scm_car (s))) + { + SCM outputs = score + ->book_rendering (output_paper_book->paper_, layout); + + while (scm_is_pair (outputs)) + { + Music_output *output = unsmob_music_output (scm_car (outputs)); + + if (Performance *perf = dynamic_cast (output)) + output_paper_book->add_performance (perf->self_scm ()); + else if (Paper_score *pscore = dynamic_cast (output)) + { + if (ly_is_module (score->get_header ())) + output_paper_book->add_score (score->get_header ()); + output_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))) + output_paper_book->add_score (scm_car (s)); + else + assert (0); + +} + /* Concatenate all score or book part outputs into a Paper_book */ Paper_book * Book::process (Output_def *default_paper, Output_def *default_layout, - Output_def *parent_paper) + Paper_book *parent_part) { Output_def *paper = paper_ ? paper_ : default_paper; /* If top book, recursively check score errors */ - if (!parent_paper && error_found ()) + if (!parent_part && error_found ()) return 0; if (!paper) @@ -204,57 +257,25 @@ Book::process (Output_def *default_paper, Real scale = scm_to_double (paper->c_variable ("output-scale")); Output_def *scaled_bookdef = scale_output_def (paper, scale); paper_book->paper_ = scaled_bookdef; - if (parent_paper) - paper_book->paper_->parent_ = parent_paper; + if (parent_part) + { + paper_book->parent_ = parent_part; + paper_book->paper_->parent_ = parent_part->paper_; + } paper_book->header_ = header_; if (scm_is_pair (bookparts_)) { /* Process children book parts */ - add_bookpart (); - for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) - { - if (Book *book = unsmob_book (scm_car (p))) - { - Paper_book *paper_book_part = book - ->process (paper, default_layout, paper_book->paper_); - if (paper_book_part) - paper_book->add_bookpart (paper_book_part->self_scm ()); - } - } + process_bookparts (paper_book, paper, default_layout); } else { /* Process scores */ - /* Render in order of parsing. */ + /* Render in order of parsing. */ for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) { - if (Score *score = unsmob_score (scm_car (s))) - { - 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->get_header ())) - paper_book->add_score (score->get_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); + process_score (s, paper_book, default_layout); } }