X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fpage-spacing.hh;h=4775baf67439da958720aec320e885aa1733f4a4;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=3730262c75516de87031b9c20056016c93526c35;hpb=626609cc7a4ae66412702d2c22eef2eb3088917e;p=lilypond.git diff --git a/lily/include/page-spacing.hh b/lily/include/page-spacing.hh index 3730262c75..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 @@ -26,14 +36,13 @@ BAD_SPACING_PENALTY is for occasions where the spacing is bad. TERRIBLE_SPACING_PENALTY is for when we are disregarding a user override - (for example, we are failing to satisfy min-systems-per-page. These user + (for example, we are failing to satisfy min-systems-per-page). These user overrides are more important than getting good spacing, so they get a larger penalty. */ 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 @@ -53,18 +63,28 @@ private: force_ = infinity_f; 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_; @@ -81,20 +101,23 @@ struct Page_spacing Real rod_height_; Real spring_len_; Real inverse_spring_k_; - Real page_top_space_; + bool has_footnotes_; Line_details last_line_; Line_details first_line_; + Page_breaking const *breaker_; - Page_spacing (Real page_height, Real page_top_space) + Page_spacing (Real page_height, Page_breaking const *breaker) { page_height_ = page_height; - page_top_space_ = page_top_space; + 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 ();