X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fpage-spacing.hh;h=846fe1be3e12043f86db917733283eb0eacd345b;hb=0387f04497978e37b335a8b99eec905499d6ad0f;hp=e7e3b4888ab38cf7c63a95cf6d51c8ff9f4b4277;hpb=ba420bc05855eeca5fb937939261baffd614c2ef;p=lilypond.git diff --git a/lily/include/page-spacing.hh b/lily/include/page-spacing.hh index e7e3b4888a..846fe1be3e 100644 --- a/lily/include/page-spacing.hh +++ b/lily/include/page-spacing.hh @@ -4,34 +4,80 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2008 Joe Neeman */ #ifndef PAGE_SPACING_HH #define PAGE_SPACING_HH #include "constrained-breaking.hh" +#include "page-spacing-result.hh" -struct Spacing_result { - vector systems_per_page_; - vector force_; - Real penalty_; - Real demerits_; - Spacing_result () +/* 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. +*/ +class Page_spacer +{ +public: + Page_spacer (vector const &lines, vsize first_page_num, Page_breaking const*); + Page_spacing_result solve (vsize page_count); + +private: + struct Page_spacing_node { - penalty_ = 0; - demerits_ = 0; - } + Page_spacing_node () + { + demerits_ = infinity_f; + force_ = infinity_f; + penalty_ = infinity_f; + prev_ = VPOS; + } + + Real demerits_; + Real force_; + Real penalty_; + vsize prev_; + }; + + Page_breaking const *breaker_; + vsize first_page_num_; + vector lines_; + Matrix state_; + vsize max_page_count_; + + bool ragged_; + bool ragged_last_; + + void resize (vsize page_count); + bool calc_subproblem (vsize page, vsize lines); }; -Spacing_result -space_systems_on_min_pages (vector const&, - Real page_height, - Real odd_pages_penalty); -Spacing_result -space_systems_on_best_pages (vector const&, - Real page_height, - Real odd_pages_penalty); +struct Page_spacing +{ + Real force_; + Real page_height_; + Real rod_height_; + Real spring_len_; + Real inverse_spring_k_; + Real page_top_space_; + + Line_details last_line_; + Line_details first_line_; + + Page_spacing (Real page_height, Real page_top_space) + { + page_height_ = page_height; + page_top_space_ = page_top_space; + clear (); + } + + void calc_force (); + void resize (Real new_height); + void append_system (const Line_details &line); + void prepend_system (const Line_details &line); + void clear (); +}; #endif /* PAGE_SPACING_HH */