X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=fa40e5ef582a1fcd7d82665dc02ab7d3bb114db5;hb=2c22efe5a46a37065b10c3f51c5d7db00d07d318;hp=30ccabda813ed19b8593aca60df4458d50ad677d;hpb=0445fdfeac099c2ddcdaa9bc7568fa616e4e549e;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 30ccabda81..fa40e5ef58 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -3,28 +3,30 @@ source file of the GNU LilyPond music typesetter - (c) 2004 Jan Nieuwenhuizen + (c) 2004--2005 Jan Nieuwenhuizen */ -#include "ly-module.hh" +#include "paper-book.hh" + #include "main.hh" #include "output-def.hh" -#include "paper-book.hh" -#include "paper-outputter.hh" #include "paper-score.hh" #include "paper-system.hh" -#include "stencil.hh" +#include "text-interface.hh" #include "warn.hh" #include "ly-smobs.icc" Paper_book::Paper_book () { - pages_ = SCM_BOOL_F; - lines_ = SCM_BOOL_F; header_ = SCM_EOL; - - bookpaper_ = 0; + header_0_ = SCM_EOL; + pages_ = SCM_BOOL_F; + scores_ = SCM_EOL; + performances_ = SCM_EOL; + systems_ = SCM_BOOL_F; + + paper_ = 0; smobify_self (); } @@ -33,313 +35,309 @@ 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 Paper_book::mark_smob (SCM smob) { - Paper_book *b = (Paper_book*) SCM_CELL_WORD_1 (smob); - for (int i = 0; i < b->score_lines_.size (); i++) - b->score_lines_[i].gc_mark (); - - if (b->bookpaper_) - scm_gc_mark (b->bookpaper_->self_scm ()); + Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); + if (b->paper_) + scm_gc_mark (b->paper_->self_scm ()); scm_gc_mark (b->header_); + scm_gc_mark (b->header_0_); scm_gc_mark (b->pages_); - return b->lines_; + scm_gc_mark (b->performances_); + scm_gc_mark (b->scores_); + return b->systems_; } int Paper_book::print_smob (SCM smob, SCM port, scm_print_state*) { - Paper_book *b = (Paper_book*) ly_cdr (smob); - + Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); + scm_puts ("#<", port); scm_puts (classname (b), port); scm_puts (" ", port); - //scm_puts (b->, port); scm_puts (">", port); return 1; } -Array -split_string (String s, char c) -{ - Array rv; - while (s.length ()) - { - int i = s.index (c); - - if (i == 0) - { - s = s.nomid_string (0, 1); - continue; - } - - if (i < 0) - i = s.length () ; - - rv.push (s.cut_string (0, i)); - s = s.nomid_string (0, i); - } - - return rv; -} - SCM dump_fields () { SCM fields = SCM_EOL; - for (int i = dump_header_fieldnames_global.size (); i--; ) + for (int i = dump_header_fieldnames_global.size (); i--;) fields = scm_cons (ly_symbol2scm (dump_header_fieldnames_global[i].to_str0 ()), fields); return fields; } -LY_DEFINE (ly_output_formats, "ly:output-formats", - 0, 0, 0, (), - "Formats passed to --format as a list of strings, " - "used for the output.") +void +Paper_book::add_score (SCM s) +{ + scores_ = scm_cons (s, scores_); +} + +void +Paper_book::add_performance (SCM s) { - Array output_formats = split_string (output_format_global, ','); - - SCM lst = SCM_EOL; - int output_formats_count = output_formats.size (); - for (int i = 0; i < output_formats_count; i ++) - lst = scm_cons (scm_makfrom0str (output_formats[i].to_str0 ()), lst); - - return lst; + performances_ = scm_cons (s, performances_); } void -Paper_book::output (String outname) +Paper_book::output (SCM output_channel) { - if (!score_lines_.size ()) + if (scores_ == SCM_EOL) return; /* Generate all stencils to trigger font loads. */ pages (); - - SCM formats = ly_output_formats (); - for (SCM s = formats; ly_c_pair_p (s); s = ly_cdr (s)) + + SCM scopes = SCM_EOL; + if (ly_is_module (header_)) + scopes = scm_cons (header_, scopes); + + String mod_nm = "scm framework-" + output_backend_global; + + SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); + if (make_print) { - String format = ly_scm2string (ly_car (s)); - Paper_outputter *out = get_paper_outputter (outname + "." + format, - format); - - SCM scopes = SCM_EOL; - if (ly_c_module_p (header_)) - scopes = scm_cons (header_, scopes); - - String func_nm = format; - func_nm = "output-framework-" + func_nm; - String mod_nm = "scm framework-" + format; - - SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); - SCM func = scm_c_module_lookup (mod, func_nm.to_str0 ()); + SCM func = scm_c_module_lookup (mod, "output-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (out->self_scm (), + scm_apply_0 (func, scm_list_n (output_channel, self_scm (), scopes, dump_fields (), - scm_makfrom0str (outname.to_str0 ()), SCM_UNDEFINED)); + } - scm_gc_unprotect_object (out->self_scm ()); - progress_indication ("\n"); + if (make_preview) + { + SCM func = scm_c_module_lookup (mod, "output-preview-framework"); + func = scm_variable_ref (func); + scm_apply_0 (func, scm_list_n (output_channel, + self_scm (), + scopes, + dump_fields (), + SCM_UNDEFINED)); } } void -Paper_book::classic_output (String outname) +Paper_book::classic_output (SCM output) { /* Generate all stencils to trigger font loads. */ - lines (); + systems (); - // ugh code dup 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 (score_lines_[0].header_)) - scopes = scm_cons (score_lines_[0].header_, scopes); - //end ugh + if (ly_is_module (header_0_)) + scopes = scm_cons (header_0_, scopes); - Array output_formats = split_string (output_format_global, ','); + String format = output_backend_global; + String mod_nm = "scm framework-" + format; - for (int i = 0; i < output_formats.size (); i++) - { - String format = output_formats[i]; - String func_nm = format; - func_nm = "output-classic-framework-" + func_nm; - String mod_nm = "scm framework-" + format; - - SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); - SCM func = scm_c_module_lookup (mod, func_nm.to_str0 ()); + SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); + SCM func = scm_c_module_lookup (mod, "output-classic-framework"); - func = scm_variable_ref (func); - - Paper_outputter *out = get_paper_outputter (outname + "." + format, - format); + func = scm_variable_ref (func); + scm_apply_0 (func, scm_list_n (output, + self_scm (), + scopes, + dump_fields (), + SCM_UNDEFINED)); - scm_apply_0 (func, scm_list_5 (out->self_scm (), self_scm (), scopes, - dump_fields (), - scm_makfrom0str (outname.to_str0 ()))); - - scm_gc_unprotect_object (out->self_scm ()); - progress_indication ("\n"); - } -} - -LY_DEFINE (ly_paper_book_pages, "ly:paper-book-pages", - 1, 0, 0, (SCM pb), - "Return pages in book PB.") -{ - return unsmob_paper_book(pb)->pages (); -} - -LY_DEFINE (ly_paper_book_scopes, "ly:paper-book-scopes", - 1, 0, 0, (SCM book), - "Return pages in paper book @var{book}.") -{ - Paper_book *pb = unsmob_paper_book(book); - SCM_ASSERT_TYPE(pb, book, SCM_ARG1, __FUNCTION__, "Paper_book"); - - SCM scopes = SCM_EOL; - if (ly_c_module_p (pb->header_)) - scopes = scm_cons (pb->header_, scopes); - - return scopes; -} - -LY_DEFINE (ly_paper_book_lines, "ly:paper-book-lines", - 1, 0, 0, (SCM pb), - "Return lines in book PB.") -{ - return unsmob_paper_book (pb)->lines (); -} - -LY_DEFINE (ly_paper_book_book_paper, "ly:paper-book-book-paper", - 1, 0, 0, (SCM pb), - "Return pages in book PB.") -{ - return unsmob_paper_book (pb)->bookpaper_->self_scm (); + progress_indication ("\n"); } /* TODO: resurrect more complex user-tweaks for titling? */ Stencil Paper_book::book_title () { - SCM title_func = bookpaper_->lookup_variable (ly_symbol2scm ("book-title")); + SCM title_func = paper_->lookup_variable (ly_symbol2scm ("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, - bookpaper_->self_scm (), - scopes); + paper_->self_scm (), + scopes); if (unsmob_stencil (tit)) title = *unsmob_stencil (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); - + return title; } Stencil -Paper_book::score_title (int i) +Paper_book::score_title (SCM header) { - SCM title_func = bookpaper_->lookup_variable (ly_symbol2scm ("score-title")); + SCM title_func = paper_->lookup_variable (ly_symbol2scm ("score-title")); Stencil title; - // ugh code dup 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 (score_lines_[i].header_)) - scopes = scm_cons (score_lines_[i].header_, scopes); - //end ugh + 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, - bookpaper_->self_scm (), - scopes); + paper_->self_scm (), + scopes); if (unsmob_stencil (tit)) title = *unsmob_stencil (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); - + return title; } - + +void +set_system_penalty (Paper_system *ps, SCM header) +{ + if (ly_is_module (header)) + { + SCM force = ly_module_lookup (header, ly_symbol2scm ("breakbefore")); + if (SCM_VARIABLEP (force) + && scm_is_bool (SCM_VARIABLE_REF (force))) + { + ps->break_before_penalty_ = to_boolean (SCM_VARIABLE_REF (force)) + ? -10000 + : 10000; + } + } +} + +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_); + ps->unprotect (); + set_system_penalty (ps, header); + } +} + SCM -Paper_book::lines () +Paper_book::systems () { - if (lines_ != SCM_BOOL_F) - return lines_; + if (systems_ != SCM_BOOL_F) + return systems_; - lines_ = SCM_EOL; + systems_ = SCM_EOL; Stencil title = book_title (); if (!title.is_empty ()) { - Paper_system *pl = new Paper_system (title, true); - lines_ = scm_cons (pl->self_scm (), lines_); - scm_gc_unprotect_object (pl->self_scm ()); + Paper_system *ps = new Paper_system (title, true); + set_system_penalty (ps, header_); + + systems_ = scm_cons (ps->self_scm (), systems_); + ps->unprotect (); } - - int score_count = score_lines_.size (); - for (int i = 0; i < score_count; i++) + + SCM page_properties + = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), + paper_->self_scm ()); + + SCM header = SCM_EOL; + for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s)) { - Stencil title = score_title (i); - if (!title.is_empty ()) + if (ly_is_module (scm_car (s))) { - Paper_system *pl = new Paper_system (title, true); - lines_ = scm_cons (pl->self_scm (), lines_); - scm_gc_unprotect_object (pl->self_scm ()); - } - - if (scm_vector_p (score_lines_[i].lines_) == SCM_BOOL_T) - { - // guh. - SCM line_list = scm_vector_to_list (score_lines_[i].lines_); + header = scm_car (s); + if (header_0_ == SCM_EOL) + header_0_ = header; + } + else if (Music_output *mop = unsmob_music_output (scm_car (s))) - line_list = scm_reverse (line_list); - lines_ = scm_append (scm_list_2 (line_list, lines_)); + { + if (Paper_score *pscore = dynamic_cast (mop)) + { + 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_)); + } + 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_); + ps->unprotect (); + // FIXME: figure out penalty. + //set_system_penalty (ps, scores_[i].header_); + } + else + assert (0); } - - lines_ = scm_reverse (lines_); - + + systems_ = scm_reverse (systems_); + int i = 0; Paper_system *last = 0; - for (SCM s = lines_; s != SCM_EOL; s = ly_cdr (s)) + for (SCM s = systems_; s != SCM_EOL; s = scm_cdr (s)) { - Paper_system * p = unsmob_paper_line (ly_car (s)); - p->number_ = ++i; - - if (last && last->is_title ()) - // ugh, hardcoded. - p->penalty_ = 10000; - last = p; + Paper_system *ps = unsmob_paper_system (scm_car (s)); + ps->number_ = ++i; + + if (last + && last->is_title () + && !ps->break_before_penalty_) + ps->break_before_penalty_ = 10000; + last = ps; } - - return lines_; + + return systems_; } SCM @@ -349,25 +347,13 @@ Paper_book::pages () return pages_; pages_ = SCM_EOL; - Output_def *paper = bookpaper_; - SCM proc = paper->c_variable ("page-breaking"); - pages_ = scm_apply_0 (proc, scm_list_2 (lines (), self_scm ())); + SCM proc = paper_->c_variable ("page-breaking"); + pages_ = scm_apply_0 (proc, scm_list_2 (systems (), self_scm ())); return pages_; } - -/****************************************************************/ - -Score_lines::Score_lines () -{ - lines_ = SCM_EOL; - header_ = SCM_EOL; -} - -void -Score_lines::gc_mark () +SCM +Paper_book::performances () const { - scm_gc_mark (lines_); - scm_gc_mark (header_); + return scm_reverse (performances_); } -