X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=e52da05c93336195baa7014851208eb47016e660;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=3a84865462e4795f618fa995a477dca33d92e558;hpb=7f3f0083f89d87c5ed0422858e9648fc759e98a4;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 3a84865462..e52da05c93 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -1,9 +1,20 @@ /* - book.cc -- implement Book + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2014 Han-Wen Nienhuys - (c) 1997--2008 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "book.hh" @@ -50,21 +61,27 @@ Book::Book (Book const &s) paper_ = s.paper_->clone (); paper_->unprotect (); } - + input_location_ = make_input (*s.origin ()); - header_ = ly_make_anonymous_module (false); + header_ = ly_make_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 (); + SCM entry = scm_car (p); - *t = scm_cons (newscore->self_scm (), SCM_EOL); + if (Score *newscore = unsmob_score (entry)) + * t = scm_cons (newscore->clone ()->unprotect (), SCM_EOL); + else if (Page_marker *marker = unsmob_page_marker (entry)) + * t = scm_cons (marker->clone ()->unprotect (), SCM_EOL); + else + { + /* This entry is a markup list */ + *t = scm_cons (entry, SCM_EOL); + } t = SCM_CDRLOC (*t); - newscore->unprotect (); } t = &bookparts_; @@ -101,12 +118,12 @@ Book::mark_smob (SCM s) scm_gc_mark (book->scores_); scm_gc_mark (book->bookparts_); scm_gc_mark (book->input_location_); - + return book->header_; } int -Book::print_smob (SCM, SCM p, scm_print_state*) +Book::print_smob (SCM, SCM p, scm_print_state *) { scm_puts ("#", p); return 1; @@ -127,10 +144,10 @@ Book::set_parent (Book *parent) paper_->unprotect (); } paper_->parent_ = parent->paper_; - /* If this part is the first child of parent, copy its header */ - if (ly_is_module (parent->header_) && (scm_is_null (parent->bookparts_))) + /* Copy the header block of the parent */ + if (ly_is_module (parent->header_)) { - SCM tmp_header = ly_make_anonymous_module (false); + SCM tmp_header = ly_make_module (false); ly_module_copy (tmp_header, parent->header_); if (ly_is_module (header_)) ly_module_copy (tmp_header, header_); @@ -147,7 +164,7 @@ Book::add_scores_to_bookpart () { if (scm_is_pair (scores_)) { - /* If scores have been added to this book, add them to a child + /* If scores have been added to this book, add them to a child * book part */ Book *part = new Book; part->set_parent (this); @@ -173,19 +190,19 @@ Book::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 true; - + return true; + 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; } Paper_book * Book::process (Output_def *default_paper, - Output_def *default_layout) + Output_def *default_layout) { return process (default_paper, default_layout, 0); } @@ -200,9 +217,14 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu { 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 ()); + { + output_paper_book->add_bookpart (paper_book_part->self_scm ()); + paper_book_part->unprotect (); + } } } + /* In a Paper_book, bookparts are stored in straight order */ + output_paper_book->bookparts_ = scm_reverse_x (output_paper_book->bookparts_, SCM_EOL); } void @@ -211,38 +233,38 @@ 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); - + ->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); - } + { + 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))) + || 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, - Paper_book *parent_part) + Output_def *default_layout, + Paper_book *parent_part) { Output_def *paper = paper_ ? paper_ : default_paper; @@ -263,6 +285,7 @@ Book::process (Output_def *default_paper, paper_book->paper_->parent_ = parent_part->paper_; } paper_book->header_ = header_; + scaled_bookdef->unprotect (); if (scm_is_pair (bookparts_)) { @@ -271,8 +294,9 @@ Book::process (Output_def *default_paper, } else { + paper_book->paper_->normalize (); /* 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)) { process_score (s, paper_book, default_layout);