X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fpaper-book.cc;h=72648b682fe952df2d0a9a4292be258a229c3670;hb=ca91e9064f2920586a4fd610bda911ab3b4d8793;hp=37a156238a4e898dade1fc801dae3667b3a71a70;hpb=2df5b8e5efea6ea9c7494cc92491261fa027acf1;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 37a156238a..72648b682f 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Jan Nieuwenhuizen + (c) 2004--2007 Jan Nieuwenhuizen */ #include "paper-book.hh" @@ -16,6 +16,8 @@ #include "paper-system.hh" #include "text-interface.hh" #include "warn.hh" +#include "program-option.hh" +#include "page-marker.hh" #include "ly-smobs.icc" @@ -91,9 +93,9 @@ Paper_book::output (SCM output_channel) { if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("paper-book-write-midis"); - - scm_call_2 (proc, self_scm (), output_channel); + SCM proc = ly_lily_module_constant ("write-performances-midis"); + + scm_call_2 (proc, performances (), output_channel); } if (scores_ == SCM_EOL) @@ -106,10 +108,11 @@ Paper_book::output (SCM output_channel) if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); - string mod_nm = "scm framework-" + output_backend_global; + string mod_nm = "scm framework-" + get_output_backend_name (); SCM mod = scm_c_resolve_module (mod_nm.c_str ()); - if (make_print) + + if (get_program_option ("print-pages")) { SCM func = scm_c_module_lookup (mod, "output-framework"); @@ -121,7 +124,7 @@ Paper_book::output (SCM output_channel) SCM_UNDEFINED)); } - if (make_preview) + if (get_program_option ("preview")) { SCM func = scm_c_module_lookup (mod, "output-preview-framework"); func = scm_variable_ref (func); @@ -136,6 +139,13 @@ Paper_book::output (SCM output_channel) void Paper_book::classic_output (SCM output) { + if (scm_is_pair (performances_)) + { + SCM proc = ly_lily_module_constant ("write-performances-midis"); + + scm_call_2 (proc, performances (), output); + } + /* Generate all stencils to trigger font loads. */ systems (); @@ -146,7 +156,7 @@ Paper_book::classic_output (SCM output) if (ly_is_module (header_0_)) scopes = scm_cons (header_0_, scopes); - string format = output_backend_global; + string format = get_output_backend_name (); string mod_nm = "scm framework-" + format; SCM mod = scm_c_resolve_module (mod_nm.c_str ()); @@ -217,10 +227,27 @@ Paper_book::score_title (SCM header) return title; } +void +set_page_permission (SCM sys, SCM symbol, SCM permission) +{ + if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + { + vector cols = ps->get_columns (); + if (cols.size ()) + { + Paper_column *col = dynamic_cast (cols.back ()); + col->set_property (symbol, permission); + col->find_prebroken_piece (LEFT)->set_property (symbol, permission); + } + } + else if (Prob *pb = unsmob_prob (sys)) + pb->set_property (symbol, permission); +} + /* read the breakbefore property of a score block and set up the preceding - system-spec to honour it. That is, SYM should be the system spec that + system-spec to honour it. That is, SYS should be the system spec that immediately precedes the score (from which HEADER is taken) - in the get_system_specs() list */ + in the get_system_specs () list */ void set_system_penalty (SCM sys, SCM header) { @@ -230,25 +257,36 @@ set_system_penalty (SCM sys, SCM header) if (SCM_VARIABLEP (force) && scm_is_bool (SCM_VARIABLE_REF (force))) { - bool b = to_boolean (SCM_VARIABLE_REF (force)); - SCM sym = b ? ly_symbol2scm ("force") : SCM_EOL; - - if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + if (to_boolean (SCM_VARIABLE_REF (force))) { - vector cols = ps->get_columns (); - if (cols.size ()) - { - Paper_column *col = dynamic_cast (cols.back ()); - col->set_property ("page-break-permission", sym); - col->find_prebroken_piece (LEFT)->set_property ("page-break-permission", sym); - } + set_page_permission (sys, ly_symbol2scm ("page-break-permission"), + ly_symbol2scm ("force")); + set_page_permission (sys, ly_symbol2scm ("line-break-permission"), + ly_symbol2scm ("force")); } - else if (Prob *pb = unsmob_prob (sys)) - pb->set_property ("page-break-permission", sym); + else + set_page_permission (sys, ly_symbol2scm ("page-break-permission"), SCM_EOL); } } } +void +set_label (SCM sys, SCM label) +{ + if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + { + vector cols = ps->get_columns (); + if (cols.size ()) + { + Paper_column *col = dynamic_cast (cols[0]); + col->set_property ("labels", scm_cons (label, col->get_property ("labels"))); + Paper_column *col_right = dynamic_cast (col->find_prebroken_piece (RIGHT)); + col_right->set_property ("labels", scm_cons (label, col_right->get_property ("labels"))); + } + } + else if (Prob *pb = unsmob_prob (sys)) + pb->set_property ("labels", scm_cons (label, pb->get_property ("labels"))); +} SCM Paper_book::get_score_title (SCM header) @@ -266,7 +304,7 @@ Paper_book::get_score_title (SCM header) Prob *ps = make_paper_system (props); paper_system_set_stencil (ps, title); - return ps->self_scm(); + return ps->self_scm (); } return SCM_BOOL_F; @@ -293,6 +331,7 @@ Paper_book::get_system_specs () = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), paper_->self_scm ()); + SCM interpret_markup_list = ly_lily_module_constant ("interpret-markup-list"); SCM header = SCM_EOL; for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) { @@ -302,6 +341,25 @@ 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))) + { + /* page markers are used to set page breaking/turning permission, + or to place bookmarking labels */ + if (scm_is_symbol (page_marker->permission_symbol ())) + { + /* set previous element page break or turn permission */ + if (scm_is_pair (system_specs)) + set_page_permission (scm_car (system_specs), + page_marker->permission_symbol (), + page_marker->permission_value ()); + } + if (scm_is_symbol (page_marker->label ())) + { + /* set previous element label */ + if (scm_is_pair (system_specs)) + set_label (scm_car (system_specs), page_marker->label ()); + } + } else if (Music_output *mop = unsmob_music_output (scm_car (s))) { if (Paper_score *pscore = dynamic_cast (mop)) @@ -327,21 +385,37 @@ Paper_book::get_system_specs () */ } } - else if (Text_interface::is_markup (scm_car (s))) + else if (Text_interface::is_markup_list (scm_car (s))) { - SCM t = Text_interface::interpret_markup (paper_->self_scm (), - page_properties, - scm_car (s)); - - // TODO: init props - Prob *ps = make_paper_system (SCM_EOL); - paper_system_set_stencil (ps, *unsmob_stencil (t)); - ps->set_property ("is-title", SCM_BOOL_T); - system_specs = scm_cons (ps->self_scm (), system_specs); - ps->unprotect (); - - // FIXME: figure out penalty. - //set_system_penalty (ps, scores_[i].header_); + SCM texts = scm_call_3 (interpret_markup_list, + paper_->self_scm (), + page_properties, + scm_car (s)); + for (SCM list = texts ; scm_is_pair (list) ; list = scm_cdr (list)) + { + SCM t = scm_car (list); + // TODO: init props + Prob *ps = make_paper_system (SCM_EOL); + ps->set_property ("page-break-permission", ly_symbol2scm ("allow")); + ps->set_property ("page-turn-permission", ly_symbol2scm ("allow")); + + paper_system_set_stencil (ps, *unsmob_stencil (t)); + ps->set_property ("is-title", SCM_BOOL_T); + if (scm_is_pair (scm_cdr (list))) + { + /* If an other markup is following, set this markup + * next padding and next space to 0, so that baseline-skip + * only should be taken into account for lines vertical + * spacing. */ + ps->set_property ("next-padding", scm_double2num (0.0)); + ps->set_property ("next-space", scm_double2num (0.0)); + } + system_specs = scm_cons (ps->self_scm (), system_specs); + ps->unprotect (); + + // FIXME: figure out penalty. + //set_system_penalty (ps, scores_[i].header_); + } } else assert (0); @@ -411,7 +485,7 @@ Paper_book::pages () pages_ = SCM_EOL; SCM proc = paper_->c_variable ("page-breaking-wrapper"); - pages_ = scm_apply_0 (proc, scm_list_1(self_scm ())); + pages_ = scm_apply_0 (proc, scm_list_1 (self_scm ())); /* set systems_ from the pages */ if (systems_ == SCM_BOOL_F)