X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-layout-problem.cc;h=c63dbd8b9423bdd09ef4a6a5f406b103ab97080f;hb=6ca3f1b0e92f37f9f4bc44bb3627b928a5aeccd4;hp=35443dfc8430f8c11f2e7fc82095b6c09f8fc2df;hpb=3128487939b2bfd363a4fd48c289727fe6dbc61b;p=lilypond.git diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index 35443dfc84..c63dbd8b94 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -1,10 +1,20 @@ /* - page-layout-problem.cc -- space systems nicely on a page. If systems can - be stretched, do that too. + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2009 Joe Neeman - (c) 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 . */ #include "page-layout-problem.hh" @@ -105,7 +115,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst else if (0 == Paper_column::get_rank (sys->get_bound (LEFT))) spec = between_scores_system_spacing; - Spring spring (first ? 0 : 1, 0.0); + Spring spring (0, 0); Real padding = 0.0; alter_spring_from_spacing_spec (spec, &spring); read_spacing_spec (spec, &padding, ly_symbol2scm ("padding")); @@ -117,7 +127,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst { SCM spec = first ? top_system_spacing : (last_system_was_title ? between_title_spacing : before_title_spacing); - Spring spring (first ? 0 : 1, 0.0); + Spring spring (0, 0); Real padding = 0.0; alter_spring_from_spacing_spec (spec, &spring); read_spacing_spec (spec, &padding, ly_symbol2scm ("padding")); @@ -253,6 +263,8 @@ Page_layout_problem::append_prob (Prob *prob, Spring const& spring, Real padding { Skyline_pair *sky = Skyline_pair::unsmob (prob->get_property ("vertical-skylines")); Real minimum_distance = 0; + bool tight_spacing = to_boolean (prob->get_property ("tight-spacing")); + if (sky) { minimum_distance = (*sky)[UP].distance (bottom_skyline_); @@ -266,10 +278,17 @@ Page_layout_problem::append_prob (Prob *prob, Spring const& spring, Real padding bottom_skyline_.clear (); bottom_skyline_.set_minimum_height (iv[DOWN]); } - minimum_distance += padding; Spring spring_copy = spring; - spring_copy.ensure_min_distance (minimum_distance); + if (tight_spacing) + { + spring_copy.set_min_distance (minimum_distance); + spring_copy.set_inverse_stretch_strength (0.0); + spring_copy.set_distance (0.0); + } + else + spring_copy.ensure_min_distance (minimum_distance + padding); + springs_.push_back (spring_copy); elements_.push_back (Element (prob)); } @@ -284,6 +303,9 @@ Page_layout_problem::solve_rod_spring_problem (bool ragged) spacer.solve (page_height_, ragged); solution_ = spacer.spring_positions (); + + if (!spacer.fits ()) + warning (_ ("couldn't fit music on page")); } // The solution_ vector stores the position of every live VerticalAxisGroup @@ -386,14 +408,13 @@ Page_layout_problem::find_system_offsets () if (loose_lines.empty ()) loose_lines.push_back (last_spaceable_line); - loose_lines.push_back (staff); if (staff_idx) loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]); else { Real min_dist = 0; - if (last_spaceable_line) - min_dist = Axis_group_interface::minimum_distance (last_spaceable_line, + if (loose_lines.back ()) + min_dist = Axis_group_interface::minimum_distance (loose_lines.back (), staff, Y_AXIS); else // distance to the top margin @@ -401,6 +422,7 @@ Page_layout_problem::find_system_offsets () loose_line_min_distances.push_back (min_dist); } + loose_lines.push_back (staff); } } @@ -434,6 +456,7 @@ Page_layout_problem::find_system_offsets () // Given two lines that are already spaced (the first and last // elements of loose_lines), distribute some unspaced lines between // them. +// first_translation and last_translation are relative to the page. void Page_layout_problem::distribute_loose_lines (vector const &loose_lines, vector const &min_distances,