X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=f1787e99550f2bb09eb001188b69384c69e5f004;hb=dcb458c225534895f69f4c05137809d20d6a79b9;hp=aecafbe3a053d66a15d884684ea570e01c011a85;hpb=1242f5fca1063945967549d4f814afcac957d344;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index aecafbe3a0..f1787e9955 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 @@ -30,8 +30,9 @@ #include "warn.hh" #include "program-option.hh" #include "page-marker.hh" +#include "ly-module.hh" +#include "lily-imports.hh" -#include "ly-smobs.icc" Paper_book::Paper_book () { @@ -52,34 +53,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 * const Paper_book::type_p_name_ = "ly:paper-book?"; SCM -Paper_book::mark_smob (SCM smob) +Paper_book::mark_smob () const { - 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 * @@ -129,19 +118,16 @@ Paper_book::output_aux (SCM output_channel, long page_nb = 0; if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("write-performances-midis"); - - scm_call_3 (proc, - performances (), - output_channel, - scm_from_long (*first_performance_number)); + Lily::write_performances_midis (performances (), + output_channel, + scm_from_long (*first_performance_number)); *first_performance_number += scm_ilength (performances_); } 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 = unsmob (scm_car (p))) { bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p))); page_nb += pbookpart->output_aux (output_channel, @@ -152,7 +138,7 @@ Paper_book::output_aux (SCM output_channel, } else { - if (scores_ == SCM_EOL) + if (scm_is_null (scores_)) return 0; paper_->set_variable (ly_symbol2scm ("first-page-number"), scm_from_long (*first_page_number)); @@ -178,7 +164,7 @@ Paper_book::output (SCM output_channel) with different line-widths) and why we need it at all. */ - if (paper_->c_variable ("line-width") == SCM_UNDEFINED) + if (SCM_UNBNDP (paper_->c_variable ("line-width"))) paper_->set_variable (ly_symbol2scm ("line-width"), paper_->c_variable ("paper-width")); @@ -201,14 +187,14 @@ Paper_book::output (SCM output_channel) SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-framework")); - if (framework != SCM_BOOL_F) + if (scm_is_true (framework)) { 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'", @@ -220,19 +206,38 @@ Paper_book::output (SCM output_channel) SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-preview-framework")); - if (framework != SCM_BOOL_F) + if (scm_is_true (framework)) { 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'", get_output_backend_name ())); } + + if (get_program_option ("crop")) + { + SCM framework + = ly_module_lookup (mod, ly_symbol2scm ("output-crop-framework")); + + if (scm_is_true (framework)) + { + SCM func = scm_variable_ref (framework); + scm_call_4 (func, + output_channel, + self_scm (), + scopes, + dump_fields ()); + } + else + warning (_f ("program option -dcrop not supported by backend `%s'", + get_output_backend_name ())); + } } void @@ -241,11 +246,9 @@ Paper_book::classic_output_aux (SCM output, { if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("write-performances-midis"); - scm_call_3 (proc, - performances (), - output, - scm_from_long (*first_performance_number)); + Lily::write_performances_midis (performances (), + output, + scm_from_long (*first_performance_number)); *first_performance_number += scm_ilength (performances_); } @@ -273,12 +276,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 +301,8 @@ Paper_book::book_title () paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (unsmob (tit)) + title = *unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -328,8 +330,8 @@ Paper_book::score_title (SCM header) paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (unsmob (tit)) + title = *unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -340,7 +342,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 = unsmob (sys)) { vector cols = ps->get_columns (); if (cols.size ()) @@ -350,7 +352,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 = unsmob (sys)) pb->set_property (symbol, permission); } @@ -384,7 +386,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 = unsmob (sys)) { vector cols = ps->get_columns (); if (cols.size ()) @@ -400,7 +402,7 @@ set_labels (SCM sys, SCM labels) labels))); } } - else if (Prob *pb = unsmob_prob (sys)) + else if (Prob *pb = unsmob (sys)) pb->set_property ("labels", scm_append_x (scm_list_2 (pb->get_property ("labels"), labels))); @@ -447,10 +449,8 @@ Paper_book::get_system_specs () } SCM page_properties - = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper_->self_scm ()); + = Lily::layout_extract_page_properties (paper_->self_scm ()); - SCM interpret_markup_list = ly_lily_module_constant ("interpret-markup-list"); SCM header = SCM_EOL; SCM labels = SCM_EOL; for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) @@ -458,10 +458,10 @@ Paper_book::get_system_specs () if (ly_is_module (scm_car (s))) { header = scm_car (s); - if (header_0_ == SCM_EOL) + if (scm_is_null (header_0_)) header_0_ = header; } - else if (Page_marker *page_marker = unsmob_page_marker (scm_car (s))) + else if (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 +479,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 = unsmob (scm_car (s))) { if (Paper_score *pscore = dynamic_cast (mop)) { @@ -488,10 +488,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 (unsmob (title)) { system_specs = scm_cons (title, system_specs); - unsmob_prob (title)->unprotect (); + unsmob (title)->unprotect (); } header = SCM_EOL; @@ -511,10 +511,9 @@ Paper_book::get_system_specs () } else if (Text_interface::is_markup_list (scm_car (s))) { - SCM texts = scm_call_3 (interpret_markup_list, - paper_->self_scm (), - page_properties, - scm_car (s)); + SCM texts = Lily::interpret_markup_list (paper_->self_scm (), + page_properties, + scm_car (s)); Prob *first = 0; Prob *last = 0; for (SCM list = texts; scm_is_pair (list); list = scm_cdr (list)) @@ -529,12 +528,12 @@ 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, *unsmob (t)); - SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ()); + SCM footnotes = get_footnotes (unsmob (t)->expr ()); ps->set_property ("footnotes", footnotes); ps->set_property ("is-title", SCM_BOOL_T); - if (list == texts) + if (scm_is_eq (list, texts)) first = ps; else { @@ -574,7 +573,7 @@ Paper_book::get_system_specs () SCM Paper_book::systems () { - if (systems_ != SCM_BOOL_F) + if (scm_is_true (systems_)) return systems_; systems_ = SCM_EOL; @@ -582,7 +581,7 @@ Paper_book::systems () { 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))) + if (Paper_book *pbookpart = unsmob (scm_car (p))) system_list = scm_cons (pbookpart->systems (), system_list); systems_ = scm_append (scm_reverse_x (system_list, SCM_EOL)); } @@ -592,7 +591,7 @@ 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)))) + = unsmob (scm_car (s))) { SCM system_list = scm_vector_to_list (pscore->get_paper_systems ()); @@ -611,7 +610,7 @@ Paper_book::systems () Prob *last = 0; for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s)) { - Prob *ps = unsmob_prob (scm_car (s)); + Prob *ps = unsmob (scm_car (s)); ps->set_property ("number", scm_from_int (++i)); if (last @@ -623,10 +622,10 @@ 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)); - if (perm == SCM_EOL) + Prob *next = unsmob (scm_cadr (s)); + if (scm_is_null (perm)) next->set_property ("penalty", scm_from_int (10001)); - else if (perm == ly_symbol2scm ("force")) + else if (scm_is_eq (perm, ly_symbol2scm ("force"))) next->set_property ("penalty", scm_from_int (-10001)); } } @@ -638,43 +637,45 @@ Paper_book::systems () SCM Paper_book::pages () { - if (SCM_BOOL_F != pages_) + if (scm_is_true (pages_)) return pages_; pages_ = SCM_EOL; 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 = 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_apply_1 (page_stencil, scm_car (pages), SCM_EOL); + 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) + if (scm_is_false (systems_)) { systems_ = SCM_EOL; for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p)) { - Prob *page = unsmob_prob (scm_car (p)); + Prob *page = 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_;