X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fconstrained-breaking.hh;h=8378a959e297777ed9ae612e4f85128504528b14;hb=794dcbdb52faf4292036cd1b0270a956cf4316a3;hp=502e8c234a0fa24b940d6656aa305f3fa57818fb;hpb=a276a19dc6bd57832db3107f2f2cbb04cb4677b6;p=lilypond.git diff --git a/lily/include/constrained-breaking.hh b/lily/include/constrained-breaking.hh index 502e8c234a..8378a959e2 100644 --- a/lily/include/constrained-breaking.hh +++ b/lily/include/constrained-breaking.hh @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006--2007 Joe Neeman + (c) 2006--2009 Joe Neeman */ #ifndef CONSTRAINED_BREAKING_HH @@ -15,9 +15,12 @@ #include "prob.hh" struct Line_details { + Grob *last_column_; Real force_; Interval extent_; /* Y-extent of the system */ - Real padding_; /* compulsory space after this system (if we're not last on a page) */ + + Real padding_; /* compulsory space after this system (if we're not + last on a page) */ Real bottom_padding_; Real space_; /* spring length */ Real inverse_hooke_; @@ -29,8 +32,19 @@ struct Line_details { Real page_penalty_; Real turn_penalty_; + bool title_; + + /* The page-breaker deals with forbidden page breaks by "compressing" + two Line_detailses into one. The following fields are used by the + page-breaker to keep track of this. If the number of fields needed + by the page-breaker grows, it might be a good idea to create a separate + class. */ + int compressed_lines_count_; + int compressed_nontitle_lines_count_; + Line_details () { + last_column_ = 0; force_ = infinity_f; padding_ = 0; bottom_padding_ = 0; @@ -42,15 +56,19 @@ struct Line_details { break_penalty_ = 0; page_penalty_ = 0; turn_penalty_ = 0; + title_ = false; + compressed_lines_count_ = 1; + compressed_nontitle_lines_count_ = 1; } Line_details (Prob *pb) { + last_column_ = 0; force_ = 0; extent_ = unsmob_stencil (pb->get_property ("stencil")) ->extent (Y_AXIS); - padding_ = 0; + padding_ = robust_scm2double (pb->get_property ("next-padding"), 0); bottom_padding_ = 0; - space_ = 1.0; + space_ = robust_scm2double (pb->get_property ("next-space"), 1.0); inverse_hooke_ = 1.0; break_permission_ = ly_symbol2scm ("allow"); page_permission_ = pb->get_property ("page-break-permission"); @@ -58,6 +76,9 @@ struct Line_details { break_penalty_ = 0; page_penalty_ = robust_scm2double (pb->get_property ("page-break-penalty"), 0); turn_penalty_ = robust_scm2double (pb->get_property ("page-turn-penalty"), 0); + title_ = to_boolean (pb->get_property ("is-title")); + compressed_lines_count_ = 1; + compressed_nontitle_lines_count_ = title_ ? 0 : 1; } }; @@ -93,17 +114,15 @@ struct Constrained_break_node class Constrained_breaking { public: - vector solve (); + vector solve (vsize start, vsize end, vsize sys_count); + vector best_solution (vsize start, vsize end); + vector line_details (vsize start, vsize end, vsize sys_count); + Constrained_breaking (Paper_score *ps); Constrained_breaking (Paper_score *ps, vector const &start_col_posns); - vector get_solution (vsize start, vsize end, vsize sys_count); - vector get_best_solution (vsize start, vsize end); - vector get_details (vsize start, vsize end, vsize sys_count); - int get_max_systems (vsize start, vsize end); - int get_min_systems (vsize start, vsize end); - - void resize (vsize systems); + int max_system_count (vsize start, vsize end); + int min_system_count (vsize start, vsize end); private: Paper_score *pscore_; @@ -127,6 +146,7 @@ private: vector breaks_; void initialize (); + void resize (vsize systems); Column_x_positions space_line (vsize start_col, vsize end_col); vsize prepare_solution (vsize start, vsize end, vsize sys_count);