X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=382577146fe1321f75cf765b1eaceebcad332865;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=055a6a469b4addb0b8a4012be5514a2979ec00d8;hpb=d61cf3bbdb1c6670a127ba3baddf2f04d3e34fd3;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 055a6a469b..382577146f 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ #include "program-option.hh" #include "page-marker.hh" -#include "ly-smobs.icc" Paper_book::Paper_book () { @@ -52,34 +51,22 @@ Paper_book::~Paper_book () { } -IMPLEMENT_DEFAULT_EQUAL_P (Paper_book); -IMPLEMENT_SMOBS (Paper_book); -IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?"); +const char Paper_book::type_p_name_[] = "ly:paper-book?"; SCM -Paper_book::mark_smob (SCM smob) +Paper_book::mark_smob () { - Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); - if (b->paper_) - scm_gc_mark (b->paper_->self_scm ()); - if (b->parent_) - scm_gc_mark (b->parent_->self_scm ()); - scm_gc_mark (b->header_); - scm_gc_mark (b->header_0_); - scm_gc_mark (b->pages_); - scm_gc_mark (b->performances_); - scm_gc_mark (b->scores_); - scm_gc_mark (b->bookparts_); - return b->systems_; -} - -int -Paper_book::print_smob (SCM smob, SCM port, scm_print_state *) -{ - Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); - (void)b; - scm_puts ("#", port); - return 1; + if (paper_) + scm_gc_mark (paper_->self_scm ()); + if (parent_) + scm_gc_mark (parent_->self_scm ()); + scm_gc_mark (header_); + scm_gc_mark (header_0_); + scm_gc_mark (pages_); + scm_gc_mark (performances_); + scm_gc_mark (scores_); + scm_gc_mark (bookparts_); + return systems_; } Output_def * @@ -141,7 +128,7 @@ Paper_book::output_aux (SCM output_channel, if (scm_is_pair (bookparts_)) { for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) + if (Paper_book *pbookpart = Paper_book::unsmob (scm_car (p))) { bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p))); page_nb += pbookpart->output_aux (output_channel, @@ -204,11 +191,11 @@ Paper_book::output (SCM output_channel) if (framework != SCM_BOOL_F) { SCM func = scm_variable_ref (framework); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + scm_call_4 (func, + output_channel, + self_scm (), + scopes, + dump_fields ()); } else warning (_f ("program option -dprint-pages not supported by backend `%s'", @@ -223,11 +210,11 @@ Paper_book::output (SCM output_channel) if (framework != SCM_BOOL_F) { SCM func = scm_variable_ref (framework); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + scm_call_4 (func, + output_channel, + self_scm (), + scopes, + dump_fields ()); } else warning (_f ("program option -dpreview not supported by backend `%s'", @@ -273,12 +260,11 @@ Paper_book::classic_output (SCM output) SCM func = scm_c_module_lookup (mod, "output-classic-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (output, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); - + scm_call_4 (func, + output, + self_scm (), + scopes, + dump_fields ()); progress_indication ("\n"); } @@ -299,8 +285,8 @@ Paper_book::book_title () paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (Stencil::is_smob (tit)) + title = *Stencil::unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -328,8 +314,8 @@ Paper_book::score_title (SCM header) paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (Stencil::is_smob (tit)) + title = *Stencil::unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -340,7 +326,7 @@ Paper_book::score_title (SCM header) void set_page_permission (SCM sys, SCM symbol, SCM permission) { - if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + if (Paper_score *ps = dynamic_cast (Music_output::unsmob (sys))) { vector cols = ps->get_columns (); if (cols.size ()) @@ -350,7 +336,7 @@ set_page_permission (SCM sys, SCM symbol, SCM permission) col->find_prebroken_piece (LEFT)->set_property (symbol, permission); } } - else if (Prob *pb = unsmob_prob (sys)) + else if (Prob *pb = Prob::unsmob (sys)) pb->set_property (symbol, permission); } @@ -384,7 +370,7 @@ set_system_penalty (SCM sys, SCM header) void set_labels (SCM sys, SCM labels) { - if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + if (Paper_score *ps = dynamic_cast (Music_output::unsmob (sys))) { vector cols = ps->get_columns (); if (cols.size ()) @@ -400,7 +386,7 @@ set_labels (SCM sys, SCM labels) labels))); } } - else if (Prob *pb = unsmob_prob (sys)) + else if (Prob *pb = Prob::unsmob (sys)) pb->set_property ("labels", scm_append_x (scm_list_2 (pb->get_property ("labels"), labels))); @@ -461,7 +447,7 @@ Paper_book::get_system_specs () if (header_0_ == SCM_EOL) header_0_ = header; } - else if (Page_marker *page_marker = unsmob_page_marker (scm_car (s))) + else if (Page_marker *page_marker = Page_marker::unsmob (scm_car (s))) { /* page markers are used to set page breaking/turning permission, or to place bookmarking labels */ @@ -479,7 +465,7 @@ Paper_book::get_system_specs () labels = scm_cons (page_marker->label (), labels); } } - else if (Music_output *mop = unsmob_music_output (scm_car (s))) + else if (Music_output *mop = Music_output::unsmob (scm_car (s))) { if (Paper_score *pscore = dynamic_cast (mop)) { @@ -488,10 +474,10 @@ Paper_book::get_system_specs () if (scm_is_pair (system_specs)) set_system_penalty (scm_car (system_specs), header); - if (unsmob_prob (title)) + if (Prob::is_smob (title)) { system_specs = scm_cons (title, system_specs); - unsmob_prob (title)->unprotect (); + Prob::unsmob (title)->unprotect (); } header = SCM_EOL; @@ -529,9 +515,9 @@ Paper_book::get_system_specs () ps->set_property ("last-markup-line", SCM_BOOL_F); ps->set_property ("first-markup-line", SCM_BOOL_F); - paper_system_set_stencil (ps, *unsmob_stencil (t)); + paper_system_set_stencil (ps, *Stencil::unsmob (t)); - SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ()); + SCM footnotes = get_footnotes (Stencil::unsmob (t)->expr ()); ps->set_property ("footnotes", footnotes); ps->set_property ("is-title", SCM_BOOL_T); if (list == texts) @@ -580,10 +566,11 @@ Paper_book::systems () systems_ = SCM_EOL; if (scm_is_pair (bookparts_)) { + SCM system_list = SCM_EOL; for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) - systems_ = scm_append_x (scm_list_2 (systems_, - pbookpart->systems ())); + if (Paper_book *pbookpart = Paper_book::unsmob (scm_car (p))) + system_list = scm_cons (pbookpart->systems (), system_list); + systems_ = scm_append (scm_reverse_x (system_list, SCM_EOL)); } else { @@ -591,27 +578,26 @@ Paper_book::systems () for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s)) { if (Paper_score * pscore - = dynamic_cast (unsmob_music_output (scm_car (s)))) + = dynamic_cast (Music_output::unsmob (scm_car (s)))) { SCM system_list = scm_vector_to_list (pscore->get_paper_systems ()); - system_list = scm_reverse (system_list); - systems_ = scm_append (scm_list_2 (system_list, systems_)); + systems_ = scm_reverse_x (system_list, systems_); } else { systems_ = scm_cons (scm_car (s), systems_); } } - systems_ = scm_reverse (systems_); + systems_ = scm_reverse_x (systems_, SCM_EOL); /* backwards compatibility for the old page breaker */ int i = 0; Prob *last = 0; for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s)) { - Prob *ps = unsmob_prob (scm_car (s)); + Prob *ps = Prob::unsmob (scm_car (s)); ps->set_property ("number", scm_from_int (++i)); if (last @@ -623,7 +609,7 @@ Paper_book::systems () if (scm_is_pair (scm_cdr (s))) { SCM perm = ps->get_property ("page-break-permission"); - Prob *next = unsmob_prob (scm_cadr (s)); + Prob *next = Prob::unsmob (scm_cadr (s)); if (perm == SCM_EOL) next->set_property ("penalty", scm_from_int (10001)); else if (perm == ly_symbol2scm ("force")) @@ -645,16 +631,26 @@ Paper_book::pages () if (scm_is_pair (bookparts_)) { for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) - pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ())); + if (Paper_book *pbookpart = Paper_book::unsmob (scm_car (p))) + pages_ = scm_cons (pbookpart->pages (), pages_); + pages_ = scm_append (scm_reverse_x (pages_, SCM_EOL)); } else if (scm_is_pair (scores_)) { SCM page_breaking = paper_->c_variable ("page-breaking"); - pages_ = scm_apply_0 (page_breaking, scm_list_1 (self_scm ())); + pages_ = scm_call_1 (page_breaking, self_scm ()); + + // Create all the page stencils. + SCM page_module = scm_c_resolve_module ("scm page"); + SCM page_stencil = scm_c_module_lookup (page_module, "page-stencil"); + page_stencil = scm_variable_ref (page_stencil); + for (SCM pages = pages_; scm_is_pair (pages); pages = scm_cdr (pages)) + scm_call_1 (page_stencil, scm_car (pages)); + + // Perform any user-supplied post-processing. SCM post_process = paper_->c_variable ("page-post-process"); if (ly_is_procedure (post_process)) - scm_apply_2 (post_process, paper_->self_scm (), pages_, SCM_EOL); + scm_call_2 (post_process, paper_->self_scm (), pages_); /* set systems_ from the pages */ if (systems_ == SCM_BOOL_F) @@ -662,10 +658,11 @@ Paper_book::pages () systems_ = SCM_EOL; for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p)) { - Prob *page = unsmob_prob (scm_car (p)); + Prob *page = Prob::unsmob (scm_car (p)); SCM systems = page->get_property ("lines"); - systems_ = scm_append (scm_list_2 (systems_, systems)); + systems_ = scm_cons (systems, systems_); } + systems_ = scm_append (scm_reverse_x (systems_, SCM_EOL)); } } return pages_;