X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fone-line-page-breaking.cc;fp=lily%2Fone-line-page-breaking.cc;h=213864462fbfcca8f2af61ee8cfbf5ecd5469666;hb=32a34dcef0c0041c6d62677487a380b5c8b85712;hp=0000000000000000000000000000000000000000;hpb=f41973ff763d5972a85995b6d40c864281ec6714;p=lilypond.git diff --git a/lily/one-line-page-breaking.cc b/lily/one-line-page-breaking.cc new file mode 100644 index 0000000000..213864462f --- /dev/null +++ b/lily/one-line-page-breaking.cc @@ -0,0 +1,92 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2012 Joe Neeman + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "one-line-page-breaking.hh" + +#include + +#include "column-x-positions.hh" +#include "international.hh" +#include "output-def.hh" +#include "page-spacing.hh" +#include "paper-book.hh" +#include "paper-score.hh" +#include "simple-spacer.hh" +#include "system.hh" + +One_line_page_breaking::One_line_page_breaking (Paper_book *pb) + : Page_breaking (pb, 0, 0) +{ +} + +One_line_page_breaking::~One_line_page_breaking () +{ +} + +/* + This is a somewhat unconventional page-breaking algorithm. Every + score will be put on a single page, whose width is enough + to fit the entire score one one line. Line breaks and page breaks + are ignored, and the paper-width setting in the paper block + will be modified to fit the music. +*/ +SCM +One_line_page_breaking::solve () +{ + SCM all_pages = SCM_EOL; + Real max_width = 0; + for (vsize i = 0; i < system_specs_.size (); ++i) + { + if (Paper_score *ps = system_specs_[i].pscore_) + { + vector cols = ps->root_system ()->used_columns (); + + // No indent, "infinite" line width, ragged. + Column_x_positions pos = get_line_configuration (cols, numeric_limits::max (), 0, true); + vector positions; + positions.push_back (pos); + + ps->root_system ()->break_into_pieces (positions); + ps->root_system ()->do_break_substitution_and_fixup_refpoints (); + Grob *system = ps->root_system ()->broken_intos_[0]; + + vector lines_per_page; + lines_per_page.push_back (1); + SCM systems = scm_list_1 (system->self_scm ()); + SCM pages = make_pages (lines_per_page, systems); + + max_width = max (max_width, system->extent (system, X_AXIS).length ()); + all_pages = scm_cons (scm_car (pages), all_pages); + } + else if (Prob *pb = system_specs_[i].prob_) + // Because we don't call Page_breaking::systems in this algorithm, + // we need to manually unprotect the titles. + pb->unprotect (); + } + + // Alter paper-width so that it is large enough to fit every system. + // TODO: it might be nice to allow different pages to have different widths. + // This would need support in the backends (eg. framework-ps.scm). + Real right_margin = robust_scm2double (book_->paper_->c_variable ("right-margin"), 0.0); + Real left_margin = robust_scm2double (book_->paper_->c_variable ("left-margin"), 0.0); + Real width = max_width + right_margin + left_margin; + book_->paper_->set_variable (ly_symbol2scm ("paper-width"), scm_from_double (width)); + + return scm_reverse_x (all_pages, SCM_EOL); +}