X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=08367608b38d7db94fe53e12506d873a200504ee;hb=87c76f9661ab6c7c24be704336fd207597ce5b3d;hp=80ce79fb70d14c667d0b4b691df43efff733aa73;hpb=860a54ce799171277dfdbb2af8b1144bdb4587e9;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 80ce79fb70..08367608b3 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -6,196 +6,25 @@ (c) 2004 Jan Nieuwenhuizen */ -#include -#include - #include "ly-module.hh" #include "main.hh" +#include "output-def.hh" #include "paper-book.hh" -#include "paper-def.hh" #include "paper-outputter.hh" -#include "paper-line.hh" #include "paper-score.hh" +#include "paper-system.hh" #include "stencil.hh" +#include "warn.hh" -static Real const MIN_COVERAGE = 0.66; - -static SCM -stencil2line (Stencil* stil, bool is_title = false) -{ - static SCM z; - if (!z) - z = scm_permanent_object (ly_offset2scm (Offset (0, 0))); - Offset dim = Offset (stil->extent (X_AXIS).length (), - stil->extent (Y_AXIS).length ()); - Paper_line *pl = new Paper_line (dim, scm_cons (stil->smobbed_copy (), - SCM_EOL), - -10001 * is_title, is_title); - - return scm_gc_unprotect_object (pl->self_scm ()); -} - -/* Simplistic page interface */ -class Page -{ -public: - Paper_def *paper_; - static int page_count_; - int number_; - int line_count_; - - Protected_scm lines_; - Protected_scm header_; - Protected_scm footer_; - Protected_scm copyright_; - Protected_scm tagline_; - - Stencil *get_header () { return unsmob_stencil (header_); } - Stencil *get_copyright () { return unsmob_stencil (copyright_); } - Stencil *get_tagline () { return unsmob_stencil (tagline_); } - Stencil *get_footer () { return unsmob_stencil (footer_); } - - /* actual height filled with text. */ - Real height_; - - // HMMM all this size stuff to paper/paper-outputter? - Real hsize_; - Real vsize_; - Real left_margin_; - Real top_margin_; - Real bottom_margin_; - Real foot_sep_; - Real head_sep_; - Real text_width_; - - /* available area for text. */ - Real text_height (); - - Page (Paper_def*, int); - void output (Paper_outputter*, bool); -}; - -int Page::page_count_ = 0; - -Page::Page (Paper_def *paper, int number) -{ - paper_ = paper; - number_ = number; - page_count_++; - - height_ = 0; - lines_ = SCM_EOL; - line_count_ = 0; - - hsize_ = paper->get_dimension (ly_symbol2scm ("hsize")); - vsize_ = paper->get_dimension (ly_symbol2scm ("vsize")); - top_margin_ = paper->get_dimension (ly_symbol2scm ("top-margin")); - bottom_margin_ = paper->get_dimension (ly_symbol2scm ("bottom-margin")); - head_sep_ = paper->get_dimension (ly_symbol2scm ("head-sep")); - foot_sep_ = paper->get_dimension (ly_symbol2scm ("foot-sep")); - text_width_ = paper->get_dimension (ly_symbol2scm ("linewidth")); - left_margin_ = (hsize_ - text_width_) / 2; - - copyright_ = SCM_EOL; - tagline_ = SCM_EOL; - - SCM make_header = ly_scheme_function ("make-header"); - SCM make_footer = ly_scheme_function ("make-footer"); - - header_ = scm_call_2 (make_header, paper_->self_scm (), - scm_int2num (number_)); - if (get_header ()) - get_header ()->align_to (Y_AXIS, UP); - - footer_ = scm_call_2 (make_footer, paper_->self_scm (), - scm_int2num (number_)); - if (get_footer ()) - get_footer ()->align_to (Y_AXIS, UP); -} - -void -Page::output (Paper_outputter *out, bool is_last) -{ - progress_indication ("[" + to_string (number_)); - out->output_scheme (scm_list_1 (ly_symbol2scm ("start-page"))); - Offset o (left_margin_, top_margin_); - Real vfill = line_count_ > 1 ? (text_height () - height_) / (line_count_ - 1) - : 0; - - Real coverage = height_ / text_height (); - if (coverage < MIN_COVERAGE) - /* Do not space out a badly filled page. This is too simplistic - (ie broken), because this should not vary too much between - (subsequent?) pages in a book. */ - vfill = 0; - - if (get_header ()) - { - out->output_line (stencil2line (get_header ()), &o, false); - o[Y_AXIS] += head_sep_; - } - for (SCM s = lines_; s != SCM_EOL; s = ly_cdr (s)) - { - SCM line = ly_car (s); - out->output_line (line, &o, - is_last && ly_cdr (s) != SCM_EOL && !get_copyright () - && !get_tagline () && !get_footer ()); - - /* Do not put vfill between title and its music, */ - if (scm_pair_p (ly_cdr (s)) - && (!unsmob_paper_line (line)->is_title () || vfill < 0)) - o[Y_AXIS] += vfill; - /* rather put extra just before the title. */ - if (ly_cdr (s) != SCM_EOL - && (unsmob_paper_line (ly_cadr (s))->is_title () && vfill > 0)) - o[Y_AXIS] += vfill; - } - - o[Y_AXIS] = vsize_ - bottom_margin_; - if (get_copyright ()) - o[Y_AXIS] -= get_copyright ()->extent (Y_AXIS).length (); - if (get_tagline ()) - o[Y_AXIS] -= get_tagline ()->extent (Y_AXIS).length (); - if (get_footer ()) - o[Y_AXIS] -= get_footer ()->extent (Y_AXIS).length (); - - if (get_copyright ()) - out->output_line (stencil2line (get_copyright ()), &o, - is_last && !get_tagline () && !get_footer ()); - if (get_tagline ()) - out->output_line (stencil2line (get_tagline ()), &o, - is_last && !get_footer ()); - if (get_footer ()) - out->output_line (stencil2line (get_footer ()), &o, is_last); - out->output_scheme (scm_list_2 (ly_symbol2scm ("stop-page"), - ly_bool2scm (is_last && !get_footer ()))); - progress_indication ("]"); -} - -Real -Page::text_height () -{ - Real h = vsize_ - top_margin_ - bottom_margin_; - if (get_header ()) - h -= get_header ()->extent (Y_AXIS).length () + head_sep_; - if (get_copyright () || get_tagline () || get_footer ()) - h -= foot_sep_; - if (get_copyright ()) - h -= get_copyright ()->extent (Y_AXIS).length (); - if (get_tagline ()) - h -= get_tagline ()->extent (Y_AXIS).length (); - if (get_footer ()) - h -= get_footer ()->extent (Y_AXIS).length (); - return h; -} - -/****************************************************************/ +#include "ly-smobs.icc" Paper_book::Paper_book () { - copyright_ = SCM_EOL; - tagline_ = SCM_EOL; + pages_ = SCM_BOOL_F; + systems_ = SCM_BOOL_F; + header_ = SCM_EOL; + paper_ = 0; smobify_self (); } @@ -203,8 +32,6 @@ Paper_book::~Paper_book () { } -#include "ly-smobs.icc" - IMPLEMENT_DEFAULT_EQUAL_P (Paper_book); IMPLEMENT_SMOBS (Paper_book) IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?") @@ -212,25 +39,21 @@ IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?") SCM Paper_book::mark_smob (SCM smob) { - Paper_book *pb = (Paper_book*) SCM_CELL_WORD_1 (smob); - for (int i = 0; i < pb->headers_.size (); i++) - scm_gc_mark (pb->headers_[i]); - for (int i = 0; i < pb->global_headers_.size (); i++) - scm_gc_mark (pb->global_headers_[i]); - for (int i = 0; i < pb->papers_.size (); i++) - scm_gc_mark (pb->papers_[i]->self_scm ()); - for (int i = 0; i < pb->scores_.size (); i++) - scm_gc_mark (pb->scores_[i]); - - scm_gc_mark (pb->copyright_); - - return pb->tagline_; + Paper_book *b = (Paper_book*) SCM_CELL_WORD_1 (smob); + for (int i = 0; i < b->score_systems_.size (); i++) + b->score_systems_[i].gc_mark (); + + if (b->paper_) + scm_gc_mark (b->paper_->self_scm ()); + scm_gc_mark (b->header_); + scm_gc_mark (b->pages_); + 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); @@ -240,261 +63,367 @@ Paper_book::print_smob (SCM smob, SCM port, scm_print_state*) return 1; } -void -Paper_book::output (String outname) +Array +split_string (String s, char c) { - if (!papers_.size ()) - return; - - /* Generate all stencils to trigger font loads. */ - Link_array *pages = this->pages (); + 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); + } - Paper_def *paper = papers_[0]; - Paper_outputter *out = paper->get_paper_outputter (outname); - out->output_header (paper, scopes (0), pages->size (), false); + return rv; +} - int page_count = pages->size (); - for (int i = 0; i < page_count; i++) - (*pages)[i]->output (out, i + 1 == page_count); +SCM +dump_fields () +{ + SCM fields = SCM_EOL; + for (int i = dump_header_fieldnames_global.size (); i--; ) + fields + = scm_cons (ly_symbol2scm (dump_header_fieldnames_global[i].to_str0 ()), + fields); + return fields; +} - out->output_scheme (scm_list_1 (ly_symbol2scm ("end-output"))); +LY_DEFINE (ly_output_formats, "ly:output-formats", + 0, 0, 0, (), + "Formats passed to --format as a list of strings, " + "used for the output.") +{ + Array output_formats = split_string (output_format_global, ','); - /* Ugh. */ - for (int i = pages->size (); i--;) - delete pages->elem (i); - delete pages; + 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); - progress_indication ("\n"); + return lst; } -SCM -Paper_book::scopes (int i) +void +Paper_book::post_processing (SCM module, + SCM file_name) { - SCM scopes = SCM_EOL; - if (headers_[i]) - scopes = scm_cons (headers_[i], scopes); - if (global_headers_.size () - && global_headers_[i] && global_headers_[i] != headers_[i]) - scopes = scm_cons (global_headers_[i], scopes); - return scopes; + struct + { + bool do_it_; + char const *func_name_; + } settings[] = { + {make_tex, "convert-to-tex"}, + {make_dvi, "convert-to-dvi"}, + {make_ps, "convert-to-ps"}, + {make_pdf, "convert-to-pdf"}, + {make_png, "convert-to-png"}, + {0, 0}, + }; + + for (int i = 0; settings[i].func_name_; i++) + { + if (settings[i].do_it_) + { + SCM func = scm_c_module_lookup (module, settings[i].func_name_); + if (scm_variable_p (func) == SCM_BOOL_T) + { + func = scm_variable_ref (func); + if (ly_c_procedure_p (func)) + scm_call_2 (func, self_scm (), file_name); + } + } + } } -Stencil* -Paper_book::title (int i) +void +Paper_book::output (String outname) { - SCM user_title = ly_scheme_function ("user-title"); - SCM book_title = ly_scheme_function ("book-title"); - SCM score_title = ly_scheme_function ("score-title"); - SCM field = (i == 0 ? ly_symbol2scm ("bookTitle") - : ly_symbol2scm ("scoreTitle")); - - Stencil *title = 0; - SCM scopes = this->scopes (i); - SCM s = ly_modules_lookup (scopes, field); - if (s != SCM_UNDEFINED && scm_variable_bound_p (s) == SCM_BOOL_T) - title = unsmob_stencil (scm_call_2 (user_title, - papers_[0]->self_scm (), - scm_variable_ref (s))); - else - title = unsmob_stencil (scm_call_2 (i == 0 ? book_title : score_title, - papers_[0]->self_scm (), - scopes)); - if (title) - title->align_to (Y_AXIS, UP); + if (!score_systems_.size ()) + return; + + /* Generate all stencils to trigger font loads. */ + pages (); - return title; + SCM formats = ly_output_formats (); + for (SCM s = formats; scm_is_pair (s); s = scm_cdr (s)) + { + String format = ly_scm2string (scm_car (s)); + String file_name = outname; + + if (file_name != "-") + file_name += "." + format; + + Paper_outputter *out = get_paper_outputter (file_name, format); + + SCM scopes = SCM_EOL; + if (ly_c_module_p (header_)) + scopes = scm_cons (header_, scopes); + + String mod_nm = "scm framework-" + format; + + SCM mod = scm_c_resolve_module (mod_nm.to_str0 ()); + if (make_pages) + { + SCM func = scm_c_module_lookup (mod, "output-framework"); + + func = scm_variable_ref (func); + scm_apply_0 (func, scm_list_n (out->self_scm (), + self_scm (), + scopes, + dump_fields (), + scm_makfrom0str (outname.to_str0 ()), + SCM_UNDEFINED)); + out->close (); + scm_gc_unprotect_object (out->self_scm ()); + post_processing (mod, scm_makfrom0str (file_name.to_str0 ())); + } + + if (make_preview) + { + String file_name = outname + ".preview." + format; + Paper_outputter *out = get_paper_outputter (file_name, format); + + SCM func = scm_c_module_lookup (mod, "output-preview-framework"); + func = scm_variable_ref (func); + scm_apply_0 (func, scm_list_n (out->self_scm (), + self_scm (), + scopes, + dump_fields (), + scm_makfrom0str (outname.to_str0 ()), + SCM_UNDEFINED)); + + out->close (); + scm_gc_unprotect_object (out->self_scm ()); + + post_processing (mod, scm_makfrom0str (file_name.to_str0 ())); + } + } + progress_indication ("\n"); } void Paper_book::classic_output (String outname) { - int count = scores_.size (); - Paper_outputter *out = papers_.top ()->get_paper_outputter (outname); - out->output_header (papers_.top (), scopes (count - 1), 0, true); - - Paper_line *first = unsmob_paper_line (scm_vector_ref (scores_.top (), - scm_int2num (0))); - Offset o (0, -0.5 * first->dim ()[Y_AXIS]); - int line_count = SCM_VECTOR_LENGTH ((SCM) scores_.top ()); - for (int i = 0; i < line_count; i++) + /* Generate all stencils to trigger font loads. */ + systems (); + + // ugh code dup + SCM scopes = SCM_EOL; + if (ly_c_module_p (header_)) + scopes = scm_cons (header_, scopes); + + if (ly_c_module_p (score_systems_[0].header_)) + scopes = scm_cons (score_systems_[0].header_, scopes); + //end ugh + + Array output_formats = split_string (output_format_global, ','); + + for (int i = 0; i < output_formats.size (); i++) { - /* - In classic compatibility TeX tracks how large things are, and - advances the Y pos for us. If we advance it too, we get too - much space. - */ - if (output_format_global == "tex") - o = Offset (0,0); + String format = output_formats[i]; + String mod_nm = "scm framework-" + format; + + 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); - out->output_line (scm_vector_ref ((SCM) scores_.top (), - scm_int2num (i)), - &o, i == line_count - 1); + Paper_outputter *out = get_paper_outputter (outname + "." + format, + format); + + scm_apply_0 (func, scm_list_n (out->self_scm (), self_scm (), scopes, + dump_fields (), + scm_makfrom0str (outname.to_str0 ()), + SCM_UNDEFINED)); + + 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 layout book @var{book}.") +{ + Paper_book *pb = unsmob_paper_book(book); + SCM_ASSERT_TYPE(pb, book, SCM_ARG1, __FUNCTION__, "Paper_book"); - out->output_scheme (scm_list_1 (ly_symbol2scm ("end-output"))); - progress_indication ("\n"); + SCM scopes = SCM_EOL; + if (ly_c_module_p (pb->header_)) + scopes = scm_cons (pb->header_, scopes); + + return scopes; } +LY_DEFINE (ly_paper_book_systems, "ly:paper-book-systems", + 1, 0, 0, (SCM pb), + "Return systems in book PB.") +{ + return unsmob_paper_book (pb)->systems (); +} -/* calculate book height, #lines, stencils. */ -void -Paper_book::init () +LY_DEFINE (ly_paper_book_paper, "ly:paper-book-paper", + 1, 0, 0, (SCM pb), + "Return pages in book PB.") { - int score_count = scores_.size (); + return unsmob_paper_book (pb)->paper_->self_scm (); +} - /* Calculate the full book height. Hmm, can't we cache system - heights while making stencils? */ - height_ = 0; - for (int i = 0; i < score_count; i++) - { - Stencil *title = this->title (i); - if (title) - height_ += title->extent (Y_AXIS).length (); +/* TODO: resurrect more complex user-tweaks for titling? */ +Stencil +Paper_book::book_title () +{ + SCM title_func = paper_->lookup_variable (ly_symbol2scm ("book-title")); + Stencil title; - int line_count = SCM_VECTOR_LENGTH ((SCM) scores_[i]); - for (int j = 0; j < line_count; j++) - { - SCM s = scm_vector_ref ((SCM) scores_[i], scm_int2num (j)); - height_ += unsmob_paper_line (s)->dim ()[Y_AXIS]; - } - } + SCM scopes = SCM_EOL; + if (ly_c_module_p (header_)) + scopes = scm_cons (header_, scopes); + + + SCM tit = SCM_EOL; + if (ly_c_procedure_p (title_func)) + tit = scm_call_2 (title_func, + paper_->self_scm (), + scopes); - Paper_def *paper = papers_[0]; - SCM scopes = this->scopes (0); - - SCM make_tagline = ly_scheme_function ("make-tagline"); - tagline_ = scm_call_2 (make_tagline, paper->self_scm (), scopes); - Real tag_height = 0; - if (Stencil *s = unsmob_stencil (tagline_)) - tag_height = s->extent (Y_AXIS).length (); - height_ += tag_height; - - SCM make_copyright = ly_scheme_function ("make-copyright"); - copyright_ = scm_call_2 (make_copyright, paper->self_scm (), scopes); - Real copy_height = 0; - if (Stencil *s = unsmob_stencil (copyright_)) - copy_height = s->extent (Y_AXIS).length (); - height_ += copy_height; + 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) +{ + 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_)) + scopes = scm_cons (header_, scopes); + + if (ly_c_module_p (score_systems_[i].header_)) + scopes = scm_cons (score_systems_[i].header_, scopes); + //end ugh + + SCM tit = SCM_EOL; + if (ly_c_procedure_p (title_func)) + tit = scm_call_2 (title_func, + paper_->self_scm (), + scopes); + + if (unsmob_stencil (tit)) + title = *unsmob_stencil (tit); + + if (!title.is_empty ()) + title.align_to (Y_AXIS, UP); + + return title; +} + SCM -Paper_book::lines () +Paper_book::systems () { - int score_count = scores_.size (); - SCM lines = SCM_EOL; + if (systems_ != SCM_BOOL_F) + return systems_; + + systems_ = SCM_EOL; + Stencil title = book_title (); + + 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 ()); + } + + int score_count = score_systems_.size (); for (int i = 0; i < score_count; i++) { - if (Stencil *title = this->title (i)) - lines = ly_snoc (stencil2line (title, true), lines); - lines = scm_append (scm_list_2 (lines, scm_vector_to_list (scores_[i]))); + Stencil title = score_title (i); + 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 ()); + } + + if (scm_vector_p (score_systems_[i].systems_) == SCM_BOOL_T) + { + // guh. + SCM system_list = scm_vector_to_list (score_systems_[i].systems_); + + system_list = scm_reverse (system_list); + systems_ = scm_append (scm_list_2 (system_list, systems_)); + } } - //debug helper; ughr + + systems_ = scm_reverse (systems_); + int i = 0; - for (SCM s = lines; s != SCM_EOL; s = ly_cdr (s)) - unsmob_paper_line (ly_car (s))->number_ = ++i; - return lines; + Paper_system *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; + + if (last && last->is_title ()) + // ugh, hardcoded. + ps->penalty_ = 10000; + last = ps; + } + + return systems_; } -Link_array* +SCM Paper_book::pages () { - init (); - Page::page_count_ = 0; - Paper_def *paper = papers_[0]; - Page *page = new Page (paper, 1); - - Real text_height = page->text_height (); - - Real copy_height = 0; - if (Stencil *s = unsmob_stencil (copyright_)) - copy_height = s->extent (Y_AXIS).length (); - - Real tag_height = 0; - if (Stencil *s = unsmob_stencil (tagline_)) - tag_height = s->extent (Y_AXIS).length (); - - SCM all = lines (); - SCM proc = paper->get_scmvar ("page-breaking"); - SCM breaks = scm_apply_0 (proc, scm_list_n (all, scm_make_real (height_), - scm_make_real (text_height), - scm_make_real (-copy_height), - scm_make_real (-tag_height), - SCM_UNDEFINED)); - - /* Copyright on first page. */ - if (unsmob_stencil (copyright_)) - page->copyright_ = copyright_; - - Link_array *pages = new Link_array; - int page_count = SCM_VECTOR_LENGTH ((SCM) breaks); - int line = 1; - for (int i = 0; i < page_count; i++) - { - if (i) - page = new Page (paper, i+1); - int next = i + 1 < page_count - ? ly_scm2int (scm_vector_ref (breaks, scm_int2num (i))) : 0; - while ((!next && all != SCM_EOL) || line <= next) - { - SCM s = ly_car (all); - page->lines_ = ly_snoc (s, page->lines_); - page->height_ += unsmob_paper_line (s)->dim ()[Y_AXIS]; - page->line_count_++; - all = ly_cdr (all); - line++; - } - pages->push (page); - } + if (SCM_BOOL_F != pages_) + return pages_; - /* Tagline on last page. */ - if (unsmob_stencil (tagline_)) - page->tagline_ = tagline_; - - return pages; + pages_ = SCM_EOL; + SCM proc = paper_->c_variable ("page-breaking"); + pages_ = scm_apply_0 (proc, scm_list_2 (systems (), self_scm ())); + return pages_; } -static SCM -c_ragged_page_breaks (SCM lines, Real book_height, Real text_height, - Real first, Real last) -{ - int page_number = 0; - int page_count = int (book_height / text_height + 0.5); - SCM breaks = SCM_EOL; - Real page_height = text_height + first; - Real h = 0; - int number = 0; - for (SCM s = lines; s != SCM_EOL; s = ly_cdr (s)) - { - Paper_line *pl = unsmob_paper_line (ly_car (s)); - if (!pl->is_title () && h < page_height) - number++; - h += pl->dim ()[Y_AXIS]; - if (!pl->is_title () && h > page_height) - { - breaks = ly_snoc (scm_int2num (number), breaks); - page_number++; - page_height = text_height + (page_number == page_count) * last; - h = 0; - } - if (ly_cdr (s) == SCM_EOL) - breaks = ly_snoc (scm_int2num (pl->number_), breaks); - } - return scm_vector (breaks); +/****************************************************************/ + +Score_systems::Score_systems () +{ + systems_ = SCM_EOL; + header_ = SCM_EOL; } -LY_DEFINE (ly_ragged_page_breaks, "ly:ragged-page-breaks", - 5, 0, 0, (SCM lines, SCM book, SCM text, SCM first, SCM last), - "Return a vector with line numbers of page breaks.") +void +Score_systems::gc_mark () { - SCM_ASSERT_TYPE (scm_pair_p (lines), lines, SCM_ARG1, __FUNCTION__, "list"); - SCM_ASSERT_TYPE (is_number (book), book, SCM_ARG2, __FUNCTION__, "real"); - SCM_ASSERT_TYPE (is_number (text), text, SCM_ARG2, __FUNCTION__, "real"); - SCM_ASSERT_TYPE (is_number (first), first, SCM_ARG2, __FUNCTION__, "real"); - SCM_ASSERT_TYPE (is_number (last), last, SCM_ARG2, __FUNCTION__, "real"); - - return c_ragged_page_breaks (lines, - ly_scm2double (book), ly_scm2double (text), - ly_scm2double (first), ly_scm2double (last)); + scm_gc_mark (systems_); + scm_gc_mark (header_); } +