/*
- constrained-breaking.hh -- declare a line breaker that
- supports limits on the number of systems
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 2006--2015 Joe Neeman <joeneeman@gmail.com>
- (c) 2006--2007 Joe Neeman <joeneeman@gmail.com>
+ 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 <http://www.gnu.org/licenses/>.
*/
#ifndef CONSTRAINED_BREAKING_HH
#include "matrix.hh"
#include "prob.hh"
-struct Line_details {
+/*
+ * Begin/rest-of-line hack. This geometrical shape is a crude approximation
+ * of Skyline, but it is better than a rectangle.
+ */
+struct Line_shape
+{
+ Interval begin_;
+ Interval rest_;
+
+ Line_shape ()
+ {
+ }
+ Line_shape (Interval begin, Interval rest);
+ Line_shape piggyback (Line_shape mount, Real padding) const;
+};
+
+struct Line_details
+{
+ Grob *last_column_;
Real force_;
- Interval extent_; /* Y-extent of the system */
+ Line_shape shape_;
+ vector<Real> footnote_heights_; /* The footnotes at the bottom of the
+ page, where each stencil represents
+ a different footnote. */
+ vector<Real> in_note_heights_; /* The in-notes under a system,
+ where each stencil represents
+ a different in-note. */
+ Interval refpoint_extent_; /* The refpoints of the first and last
+ spaceable staff in this line. min-distance
+ should be measured from the bottom
+ refpoint_extent of one line to the
+ top refpoint_extent of the next. */
+ Real tallness_; /* Y-extent, adjusted according to begin/rest-of-line*/
Real padding_; /* compulsory space after this system (if we're not
- last on a page) */
+ last on a page) */
+ Real title_padding_;
+ Real min_distance_;
+ Real title_min_distance_;
Real bottom_padding_;
Real space_; /* spring length */
+ Real title_space_;
Real inverse_hooke_;
SCM break_permission_;
class. */
int compressed_lines_count_;
int compressed_nontitle_lines_count_;
+ bool last_markup_line_;
+ bool first_markup_line_;
+ bool tight_spacing_;
Line_details ()
{
+ last_column_ = 0;
force_ = infinity_f;
padding_ = 0;
+ title_padding_ = 0;
bottom_padding_ = 0;
+ min_distance_ = 0;
+ title_min_distance_ = 0;
space_ = 0;
+ title_space_ = 0;
inverse_hooke_ = 1;
+ tight_spacing_ = false;
break_permission_ = ly_symbol2scm ("allow");
page_permission_ = ly_symbol2scm ("allow");
turn_permission_ = ly_symbol2scm ("allow");
page_penalty_ = 0;
turn_penalty_ = 0;
title_ = false;
- compressed_lines_count_ = 0;
- compressed_nontitle_lines_count_ = 0;
+ compressed_lines_count_ = 1;
+ compressed_nontitle_lines_count_ = 1;
+ last_markup_line_ = false;
+ first_markup_line_ = false;
+ tallness_ = 0;
+ refpoint_extent_ = Interval (0, 0);
}
- Line_details (Prob *pb)
- {
- force_ = 0;
- extent_ = unsmob_stencil (pb->get_property ("stencil")) ->extent (Y_AXIS);
- padding_ = robust_scm2double (pb->get_property ("next-padding"), 0);
- bottom_padding_ = 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");
- turn_permission_ = pb->get_property ("page-turn-permission");
- 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_ = 0;
- compressed_nontitle_lines_count_ = 0;
- }
+ Line_details (Prob *pb, Output_def *paper);
+ Real full_height () const;
+ Real tallness () const;
+ Real spring_length (Line_details const &next_line) const;
};
/*
bool ragged_right_;
bool ragged_last_;
+ Real system_system_min_distance_;
+ Real system_system_padding_;
+ Real system_system_space_;
+ Real system_markup_space_;
+ Real score_system_min_distance_;
+ Real score_system_padding_;
+ Real score_markup_min_distance_;
+ Real score_markup_padding_;
+
/* the (i,j)th entry is the configuration for breaking between
columns i and j */
Matrix<Line_details> lines_;
vector<vsize> start_; /* the columns at which we might be asked to start breaking */
vector<vsize> starting_breakpoints_; /* the corresponding index in breaks_ */
- vector<Grob*> all_;
+ vector<Grob *> all_;
vector<vsize> breaks_;
void initialize ();
Real combine_demerits (Real force, Real prev_force);
- bool calc_subproblem(vsize start, vsize systems, vsize max_break_index);
+ bool calc_subproblem (vsize start, vsize systems, vsize max_break_index);
+ void fill_line_details (Line_details *, vsize, vsize);
};
#endif /* CONSTRAINED_BREAKING_HH */