X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbook.cc;h=190f077e02e9d8f79365dc548324a3985314b9a8;hb=77706635f33adff837dc7af0482f51ff3f0f5cb1;hp=72bf5eda055f7f37bd440a2f9c33a53aa82a3196;hpb=b7a0cffbf9d1069860368f289a5b50e9d1d90ba8;p=lilypond.git diff --git a/lily/book.cc b/lily/book.cc index 72bf5eda05..190f077e02 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2009 Han-Wen Nienhuys + Copyright (C) 1997--2010 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 @@ -61,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_; @@ -112,7 +118,7 @@ Book::mark_smob (SCM s) scm_gc_mark (book->scores_); scm_gc_mark (book->bookparts_); scm_gc_mark (book->input_location_); - + return book->header_; } @@ -141,7 +147,7 @@ Book::set_parent (Book *parent) /* 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_); @@ -158,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); @@ -185,7 +191,7 @@ Book::error_found () if (Score *score = unsmob_score (scm_car (s))) if (score->error_found_) 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 ()) @@ -228,11 +234,11 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) { 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)) @@ -241,7 +247,7 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) output_paper_book->add_score (score->get_header ()); output_paper_book->add_score (pscore->self_scm ()); } - + outputs = scm_cdr (outputs); } } @@ -250,7 +256,7 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) output_paper_book->add_score (scm_car (s)); else assert (0); - + } /* Concatenate all score or book part outputs into a Paper_book @@ -290,7 +296,7 @@ Book::process (Output_def *default_paper, { 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);