X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fpage-spacing.hh;h=4775baf67439da958720aec320e885aa1733f4a4;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=bf8a7e1826c3f8a3e2e06f9b2d27874a7fbf1650;hpb=2f38710a2b40a24977441aa7faa05b6ab132f3cf;p=lilypond.git diff --git a/lily/include/page-spacing.hh b/lily/include/page-spacing.hh index bf8a7e1826..4775baf674 100644 --- a/lily/include/page-spacing.hh +++ b/lily/include/page-spacing.hh @@ -1,10 +1,20 @@ /* - page-spacing.hh -- routines for spacing systems - vertically across pages + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2006--2015 Joe Neeman - (c) 2006--2009 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 . */ #ifndef PAGE_SPACING_HH @@ -33,7 +43,6 @@ const Real BAD_SPACING_PENALTY = 1e6; const Real TERRIBLE_SPACING_PENALTY = 1e8; - /* for page_count > 2, we use a dynamic algorithm similar to constrained-breaking -- we have a class that stores the intermediate calculations so they can be reused for querying different page counts. @@ -41,8 +50,9 @@ const Real TERRIBLE_SPACING_PENALTY = 1e8; class Page_spacer { public: - Page_spacer (vector const &lines, vsize first_page_num, Page_breaking const*); + Page_spacer (vector const &lines, vsize first_page_num, Page_breaking const *); Page_spacing_result solve (vsize page_count); + Page_spacing_result solve (); private: struct Page_spacing_node @@ -54,19 +64,27 @@ private: penalty_ = infinity_f; prev_ = VPOS; system_count_status_ = SYSTEM_COUNT_OK; + page_ = 0; } Real demerits_; Real force_; Real penalty_; vsize prev_; + vsize page_; int system_count_status_; }; Page_breaking const *breaker_; vsize first_page_num_; vector lines_; + + // If a page-count is requested, we use state_, which + // is indexed by page*system, for our dynamic programming + // intermediate storage. Otherwise, we use simple_state_, + // which is indexed only by system. Matrix state_; + vector simple_state_; vsize max_page_count_; bool ragged_; @@ -83,6 +101,7 @@ struct Page_spacing Real rod_height_; Real spring_len_; Real inverse_spring_k_; + bool has_footnotes_; Line_details last_line_; Line_details first_line_; @@ -92,11 +111,13 @@ struct Page_spacing { page_height_ = page_height; breaker_ = breaker; + has_footnotes_ = false; clear (); } void calc_force (); void resize (Real new_height); + Real account_for_footnotes (Line_details const &line); void append_system (const Line_details &line); void prepend_system (const Line_details &line); void clear ();