X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=81376da0a4b2e1bb2519cb83df14ff883442b9bb;hb=8d540cf685bfda800b1ea99bef1ae236dba6280d;hp=2294a0aef80dd89a0235b7cbcb731d890f6834f2;hpb=c0198cfd7fc1ad742c54afdfd5e2f943fa923dbd;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 2294a0aef8..81376da0a4 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--2005 Jan Nieuwenhuizen + (c) 2004--2006 Jan Nieuwenhuizen */ #include "paper-book.hh" @@ -56,11 +56,8 @@ int Paper_book::print_smob (SCM smob, SCM port, scm_print_state*) { Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); - - scm_puts ("#<", port); - scm_puts (classname (b), port); - scm_puts (" ", port); - scm_puts (">", port); + (void)b; + scm_puts ("#", port); return 1; } @@ -68,9 +65,9 @@ SCM dump_fields () { SCM fields = SCM_EOL; - for (int i = dump_header_fieldnames_global.size (); i--;) + for (vsize i = dump_header_fieldnames_global.size (); i--;) fields - = scm_cons (ly_symbol2scm (dump_header_fieldnames_global[i].to_str0 ()), + = scm_cons (ly_symbol2scm (dump_header_fieldnames_global[i].c_str ()), fields); return fields; } @@ -107,9 +104,9 @@ 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-" + output_backend_global; - SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); + SCM mod = scm_c_resolve_module (mod_nm.c_str ()); if (make_print) { SCM func = scm_c_module_lookup (mod, "output-framework"); @@ -147,10 +144,10 @@ Paper_book::classic_output (SCM output) if (ly_is_module (header_0_)) scopes = scm_cons (header_0_, scopes); - String format = output_backend_global; - String mod_nm = "scm framework-" + format; + string format = output_backend_global; + string mod_nm = "scm framework-" + format; - SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); + SCM mod = scm_c_resolve_module (mod_nm.c_str ()); SCM func = scm_c_module_lookup (mod, "output-classic-framework"); func = scm_variable_ref (func); @@ -219,7 +216,7 @@ Paper_book::score_title (SCM header) } void -set_system_penalty (Paper_system *ps, SCM header) +set_system_penalty (Prob *ps, SCM header) { if (ly_is_module (header)) { @@ -227,43 +224,53 @@ set_system_penalty (Paper_system *ps, SCM header) if (SCM_VARIABLEP (force) && scm_is_bool (SCM_VARIABLE_REF (force))) { - ps->break_before_penalty_ = to_boolean (SCM_VARIABLE_REF (force)) - ? -10000 - : 10000; + ps->set_property ("penalty", + scm_from_int(to_boolean (SCM_VARIABLE_REF (force)) + ? -10000 + : 10000)); } } } -void -Paper_book::add_score_title (SCM header) + +SCM +Paper_book::get_score_title (SCM header) { Stencil title = score_title (header); if (title.is_empty ()) title = score_title (header_); if (!title.is_empty ()) { - Paper_system *ps = new Paper_system (title, true); - systems_ = scm_cons (ps->self_scm (), systems_); - ps->unprotect (); + /* + TODO: this should come from the \layout {} block, which should + override settings from \paper {} + */ + SCM props = paper_->lookup_variable (ly_symbol2scm ("score-title-properties")); + Prob *ps = make_paper_system (props); + paper_system_set_stencil (ps, title); set_system_penalty (ps, header); + + return ps->self_scm(); } + + return SCM_BOOL_F; } + SCM -Paper_book::systems () +Paper_book::get_system_specs () { - if (systems_ != SCM_BOOL_F) - return systems_; - - systems_ = SCM_EOL; + SCM system_specs = SCM_EOL; + Stencil title = book_title (); - if (!title.is_empty ()) { - Paper_system *ps = new Paper_system (title, true); + SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties")); + Prob *ps = make_paper_system (props); + paper_system_set_stencil (ps, title); set_system_penalty (ps, header_); - systems_ = scm_cons (ps->self_scm (), systems_); + system_specs = scm_cons (ps->self_scm (), system_specs); ps->unprotect (); } @@ -281,17 +288,18 @@ Paper_book::systems () header_0_ = header; } else if (Music_output *mop = unsmob_music_output (scm_car (s))) - { if (Paper_score *pscore = dynamic_cast (mop)) { - add_score_title (header); + SCM title = get_score_title (header); + if (unsmob_prob (title)) + { + system_specs = scm_cons (title, system_specs); + unsmob_prob (title)->unprotect (); + } header = SCM_EOL; - - 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_)); + system_specs = scm_cons (pscore->self_scm (), system_specs); } else { @@ -300,26 +308,17 @@ Paper_book::systems () */ } } - else if (scm_is_vector (scm_car (s))) - { - /* - UGH. code dup. - */ - add_score_title (header); - header = SCM_EOL; - - SCM system_list = scm_vector_to_list (scm_car (s)); - system_list = scm_reverse (system_list); - systems_ = scm_append (scm_list_2 (system_list, systems_)); - } else if (Text_interface::is_markup (scm_car (s))) { SCM t = Text_interface::interpret_markup (paper_->self_scm (), page_properties, scm_car (s)); - // FIXME: title=true? - Paper_system *ps = new Paper_system (*unsmob_stencil (t), true); - systems_ = scm_cons (ps->self_scm (), systems_); + + // 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. @@ -329,19 +328,45 @@ Paper_book::systems () assert (0); } + system_specs = scm_reverse_x (system_specs, SCM_EOL); + return system_specs; +} + +SCM +Paper_book::systems () +{ + if (systems_ != SCM_BOOL_F) + return systems_; + + systems_ = SCM_EOL; + SCM specs = get_system_specs (); + for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s)) + { + if (Paper_score *pscore = dynamic_cast (unsmob_music_output (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_)); + } + else + { + systems_ = scm_cons (scm_car (s), systems_); + } + } + systems_ = scm_reverse (systems_); int i = 0; - Paper_system *last = 0; + Prob *last = 0; for (SCM s = systems_; s != SCM_EOL; s = scm_cdr (s)) { - Paper_system *ps = unsmob_paper_system (scm_car (s)); - ps->number_ = ++i; + Prob *ps = unsmob_prob (scm_car (s)); + ps->set_property ("number", scm_from_int (++i)); if (last - && last->is_title () - && !ps->break_before_penalty_) - ps->break_before_penalty_ = 10000; + && to_boolean (last->get_property ("is-title")) + && !scm_is_number (ps->get_property ("penalty"))) + ps->set_property ("penalty", scm_from_int (10000)); last = ps; } @@ -356,7 +381,21 @@ Paper_book::pages () pages_ = SCM_EOL; SCM proc = paper_->c_variable ("page-breaking"); - pages_ = scm_apply_0 (proc, scm_list_2 (systems (), self_scm ())); + pages_ = scm_apply_0 (proc, scm_list_1(self_scm ())); + + /* set systems_ from the pages */ + if (systems_ == SCM_BOOL_F) + { + systems_ = SCM_EOL; + for (SCM p = pages_; p != SCM_EOL; p = scm_cdr (p)) + { + Prob *page = unsmob_prob (scm_car (p)); + SCM systems = page->get_property ("lines"); + + systems_ = scm_append (scm_list_2 (systems_, systems)); + } + } + return pages_; }