X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=08e378b41eb911542203fde1766fd970240f081f;hb=26cd516049c72cf63375979fd4a0fbe2f11a9395;hp=cd9f4cbc45b1d60d7c78f75abce335a607be96c9;hpb=57be7394ffa2e7d7ba6d60548dba563f3409d472;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index cd9f4cbc45..08e378b41e 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -12,7 +12,7 @@ #include "output-def.hh" #include "paper-score.hh" #include "paper-system.hh" -#include "text-item.hh" +#include "text-interface.hh" #include "warn.hh" #include "ly-smobs.icc" @@ -23,6 +23,7 @@ Paper_book::Paper_book () header_0_ = SCM_EOL; pages_ = SCM_BOOL_F; scores_ = SCM_EOL; + performances_ = SCM_EOL; systems_ = SCM_BOOL_F; paper_ = 0; @@ -34,10 +35,10 @@ Paper_book::~Paper_book () } IMPLEMENT_DEFAULT_EQUAL_P (Paper_book); -IMPLEMENT_SMOBS (Paper_book) - IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?") +IMPLEMENT_SMOBS (Paper_book); +IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?"); - SCM +SCM Paper_book::mark_smob (SCM smob) { Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); @@ -46,6 +47,7 @@ Paper_book::mark_smob (SCM smob) 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_); return b->systems_; } @@ -79,8 +81,16 @@ Paper_book::add_score (SCM s) scores_ = scm_cons (s, scores_); } + +void +Paper_book::add_performance (SCM s) +{ + performances_ = scm_cons (s, performances_); +} + + void -Paper_book::output (String outname) +Paper_book::output (SCM output_channel) { if (scores_ == SCM_EOL) return; @@ -89,7 +99,7 @@ Paper_book::output (String outname) pages (); SCM scopes = SCM_EOL; - if (ly_c_module_p (header_)) + if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); String mod_nm = "scm framework-" + output_backend_global; @@ -100,7 +110,7 @@ Paper_book::output (String outname) SCM func = scm_c_module_lookup (mod, "output-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (scm_makfrom0str (outname.to_str0 ()), + scm_apply_0 (func, scm_list_n (output_channel, self_scm (), scopes, dump_fields (), @@ -111,7 +121,7 @@ Paper_book::output (String outname) { SCM func = scm_c_module_lookup (mod, "output-preview-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (scm_makfrom0str (outname.to_str0 ()), + scm_apply_0 (func, scm_list_n (output_channel, self_scm (), scopes, dump_fields (), @@ -120,16 +130,16 @@ Paper_book::output (String outname) } void -Paper_book::classic_output (String outname) +Paper_book::classic_output (SCM output) { /* Generate all stencils to trigger font loads. */ systems (); SCM scopes = SCM_EOL; - if (ly_c_module_p (header_)) + if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); - if (ly_c_module_p (header_0_)) + if (ly_is_module (header_0_)) scopes = scm_cons (header_0_, scopes); String format = output_backend_global; @@ -139,7 +149,7 @@ Paper_book::classic_output (String outname) SCM func = scm_c_module_lookup (mod, "output-classic-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (scm_makfrom0str (outname.to_str0 ()), + scm_apply_0 (func, scm_list_n (output, self_scm (), scopes, dump_fields (), @@ -156,11 +166,11 @@ Paper_book::book_title () Stencil title; SCM scopes = SCM_EOL; - if (ly_c_module_p (header_)) + if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); SCM tit = SCM_EOL; - if (ly_c_procedure_p (title_func)) + if (ly_is_procedure (title_func)) tit = scm_call_2 (title_func, paper_->self_scm (), scopes); @@ -182,14 +192,14 @@ Paper_book::score_title (SCM header) Stencil title; SCM scopes = SCM_EOL; - if (ly_c_module_p (header_)) + if (ly_is_module (header_)) scopes = scm_cons (header_, scopes); - if (ly_c_module_p (header)) + if (ly_is_module (header)) scopes = scm_cons (header, scopes); SCM tit = SCM_EOL; - if (ly_c_procedure_p (title_func)) + if (ly_is_procedure (title_func)) tit = scm_call_2 (title_func, paper_->self_scm (), scopes); @@ -206,7 +216,7 @@ Paper_book::score_title (SCM header) void set_system_penalty (Paper_system *ps, SCM header) { - if (ly_c_module_p (header)) + if (ly_is_module (header)) { SCM force = ly_module_lookup (header, ly_symbol2scm ("breakbefore")); if (SCM_VARIABLEP (force) @@ -219,6 +229,21 @@ set_system_penalty (Paper_system *ps, SCM header) } } +void +Paper_book::add_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_); + scm_gc_unprotect_object (ps->self_scm ()); + set_system_penalty (ps, header); + } +} + SCM Paper_book::systems () { @@ -244,26 +269,40 @@ Paper_book::systems () SCM header = SCM_EOL; for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) { - if (ly_c_module_p (scm_car (s))) + if (ly_is_module (scm_car (s))) { header = scm_car (s); if (header_0_ == SCM_EOL) header_0_ = header; } - else if (scm_is_vector (scm_car (s))) + else if (Music_output *mop = unsmob_music_output (scm_car (s))) + { - Stencil title = score_title (header); - if (title.is_empty ()) - title = score_title (header_); - if (!title.is_empty ()) + if (Paper_score *pscore = dynamic_cast (mop)) { - Paper_system *ps = new Paper_system (title, true); - systems_ = scm_cons (ps->self_scm (), systems_); - scm_gc_unprotect_object (ps->self_scm ()); - set_system_penalty (ps, header); + add_score_title (header); + + 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_)); } + else + { + /* + Ignore MIDI + */ + } + } + 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_)); @@ -314,3 +353,9 @@ Paper_book::pages () pages_ = scm_apply_0 (proc, scm_list_2 (systems (), self_scm ())); return pages_; } + +SCM +Paper_book::performances () const +{ + return scm_reverse (performances_); +}