X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fpage-breaking.hh;h=249693a05cc9b33631db6268c4cacf3f8127c776;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=548100ca8b14ca7ef40e08a9ce4da3e2e166bad9;hpb=837a30f66f73ed048a82bef3a3ff1551d06a96da;p=lilypond.git diff --git a/lily/include/page-breaking.hh b/lily/include/page-breaking.hh index 548100ca8b..249693a05c 100644 --- a/lily/include/page-breaking.hh +++ b/lily/include/page-breaking.hh @@ -4,14 +4,14 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Joe Neeman + (c) 2006--2008 Joe Neeman */ #ifndef PAGE_BREAKING_HH #define PAGE_BREAKING_HH #include "constrained-breaking.hh" -#include "lily-guile.hh" +#include "page-spacing.hh" /* Either a paper-score, markup or header. */ @@ -41,32 +41,42 @@ struct System_spec struct Break_position { - vsize sys_; /* our index in the all_ list */ - vsize score_break_; /* if sys_ is a score, then we start at the score_brk_'th - possible page-break in the score */ - Grob *col_; /* if sys_ is a score, this points to the broken column */ + /* + index in system_spec_index_, if VPOS start of book. + */ + vsize system_spec_index_; + + /* if system_spec_index_ is a score, then we start at the score_brk_'th possible + page-break in the score */ + vsize score_break_; + + /* if system_spec_index_ is a score, this points to the broken column */ + Grob *col_; bool score_ender_; Break_position (vsize s=VPOS, vsize brk=VPOS, Grob *g=NULL, bool end=false) { - sys_ = s; + system_spec_index_ = s; score_break_ = brk; col_ = g; score_ender_ = end; } + /* + lexicographic in (system_spec_index_, score_break_) + */ bool operator< (const Break_position &other) { - return (sys_ == VPOS && other.sys_ != VPOS) - || (sys_ < other.sys_) - || (sys_ == other.sys_ && score_break_ < other.score_break_); + return (system_spec_index_ == VPOS && other.system_spec_index_ != VPOS) + || (system_spec_index_ < other.system_spec_index_) + || (system_spec_index_ == other.system_spec_index_ && score_break_ < other.score_break_); } bool operator<= (const Break_position &other) { - return (sys_ == VPOS) - || (sys_ < other.sys_ && other.sys_ != VPOS) - || (sys_ == other.sys_ && score_break_ <= other.score_break_); + return (system_spec_index_ == VPOS) + || (system_spec_index_ < other.system_spec_index_ && other.system_spec_index_ != VPOS) + || (system_spec_index_ == other.system_spec_index_ && score_break_ <= other.score_break_); } }; @@ -75,40 +85,84 @@ class Page_breaking public: typedef bool (*Break_predicate) (Grob *); typedef vector Line_division; + + /* + TODO: naming. + + determine the page breaking, and break scores into lines + appropriately. + */ virtual SCM solve () = 0; Page_breaking (Paper_book *pb, Break_predicate); virtual ~Page_breaking (); + bool ragged () const; + bool ragged_last () const; + bool is_last () const; + bool ends_score () const; + Real page_height (int page_number, bool last) const; + Real page_top_space () const; + vsize system_count () const; + protected: Paper_book *book_; - Real page_height (int page_number, bool last); vsize next_system (Break_position const &break_pos) const; SCM make_pages (vector lines_per_page, SCM lines); vsize min_system_count (vsize start, vsize end); vsize max_system_count (vsize start, vsize end); - vector line_details (vsize start, vsize end, Line_division const &div); + void break_into_pieces (vsize start, vsize end, Line_division const &div); SCM systems (); - - vector line_divisions (vsize start, - vsize end, - vsize system_count, - Line_division lower_bound = Line_division (), - Line_division upper_bound = Line_division ()); + void set_current_breakpoints (vsize start, + vsize end, + vsize system_count, + Line_division lower_bound = Line_division (), + Line_division upper_bound = Line_division ()); + void set_to_ideal_line_configuration (vsize start, vsize end); + + vsize current_configuration_count () const; + Line_division current_configuration (vsize configuration_index) const; + Page_spacing_result space_systems_on_n_pages (vsize configuration_index, + vsize n, vsize first_page_num); + Page_spacing_result space_systems_on_n_or_one_more_pages (vsize configuration_index, vsize n, + vsize first_page_num); + Page_spacing_result space_systems_on_best_pages (vsize configuration_index, + vsize first_page_num); + Page_spacing_result pack_systems_on_least_pages (vsize configuration_index, + vsize first_page_num); + vsize min_page_count (vsize configuration_index, vsize first_page_num); + bool all_lines_stretched (vsize configuration_index); + Real blank_page_penalty () const; SCM breakpoint_property (vsize breakpoint, char const *str); - vector breaks_; + vsize last_break_position () const; private: + vector breaks_; vector chunks_; - vector all_; + vector system_specs_; vector line_breaking_; + bool ragged_; + bool ragged_last_; + Real page_top_space_; + vsize system_count_; + + vector current_configurations_; + vector current_chunks_; + vsize current_start_breakpoint_; + vsize current_end_breakpoint_; + + void cache_line_details (vsize configuration_index); + void clear_line_details_cache (); + vsize cached_configuration_index_; + vector cached_line_details_; + vector uncompressed_line_details_; vector chunk_list (vsize start, vsize end); Line_division system_count_bounds (vector const &chunks, bool min); @@ -121,9 +175,12 @@ private: void line_divisions_rec (vsize system_count, Line_division const &min, Line_division const &max, - vector *result, Line_division *cur); + vector line_details (vsize start, vsize end, Line_division const &div); + Page_spacing_result space_systems_on_1_page (vector const &lines, Real page_height, bool ragged); + Page_spacing_result space_systems_on_2_pages (vsize configuration_index, vsize first_page_num); + Page_spacing_result finalize_spacing_result (vsize configuration_index, Page_spacing_result); void create_system_list (); void find_chunks_and_breaks (Break_predicate); };