]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-breaking.cc
unsmob_pitch -> Pitch::unsmob and related
[lilypond.git] / lily / page-breaking.cc
index 692244b897063daab340b814da73529beee58642..252e24c5df61c2685d2b5ac415cc2292c4d7b9d5 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2006--2012 Joe Neeman <joeneeman@gmail.com>
+  Copyright (C) 2006--2014 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
@@ -195,7 +195,6 @@ compress_lines (const vector<Line_details> &orig)
       else
         {
           ret.push_back (orig[i]);
-          ret.back ().force_ = 0;
         }
     }
   return ret;
@@ -504,7 +503,7 @@ Page_breaking::page_height (int page_num, bool last) const
   // This means that we won't cache properly if page_num is negative or
   // if calc_height returns a negative number.  But that's likely to
   // be rare, so it shouldn't affect performance.
-  vector<Real>cache = last ? last_page_height_cache_ : page_height_cache_;
+  vector<Real> &cache = last ? last_page_height_cache_ : page_height_cache_;
   if (page_num >= 0 && (int) cache.size () > page_num && cache[page_num] >= 0)
     return cache[page_num];
   else
@@ -555,7 +554,7 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las
   for (SCM s = systems; scm_is_pair (s); s = scm_cdr (s))
     {
       SCM paper_system = scm_car (s);
-      if (Grob *g = unsmob_grob (scm_car (s)))
+      if (Grob *g = Grob::unsmob (scm_car (s)))
         {
           System *sys = dynamic_cast<System *> (g);
           paper_system = sys->get_paper_system ();
@@ -568,11 +567,11 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las
   // Create the page and draw it.
   SCM page = make_page (page_num, last);
 
-  Prob *p = unsmob_prob (page);
+  Prob *p = Prob::unsmob (page);
   p->set_property ("lines", paper_systems);
   p->set_property ("configuration", configuration);
 
-  Stencil *foot_p = unsmob_stencil (p->get_property ("foot-stencil"));
+  Stencil *foot_p = Stencil::unsmob (p->get_property ("foot-stencil"));
   Stencil foot = foot_p ? *foot_p : Stencil ();
 
   SCM footnotes = Page_layout_problem::get_footnotes_from_lines (systems);
@@ -632,7 +631,11 @@ Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
       else
         config = layout.solution (rag);
 
-      last_page_force = layout.force ();
+      if ((ragged () && layout.force () < 0.0)
+          || isinf (layout.force ()))
+        warning (_f ("page %d has been compressed", page_num));
+      else
+        last_page_force = layout.force ();
 
       systems_configs_fncounts = scm_cons (scm_cons (lines, config), systems_configs_fncounts);
       footnote_count += fn_lines;
@@ -655,12 +658,12 @@ Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
       for (SCM l = lines; scm_is_pair (l); l = scm_cdr (l))
         {
           SCM labels = SCM_EOL;
-          if (Grob *line = unsmob_grob (scm_car (l)))
+          if (Grob *line = Grob::unsmob (scm_car (l)))
             {
               System *system = dynamic_cast<System *> (line);
               labels = system->get_property ("labels");
             }
-          else if (Prob *prob = unsmob_prob (scm_car (l)))
+          else if (Prob *prob = Prob::unsmob (scm_car (l)))
             labels = prob->get_property ("labels");
 
           for (SCM lbls = labels; scm_is_pair (lbls); lbls = scm_cdr (lbls))
@@ -686,13 +689,13 @@ Page_breaking::create_system_list ()
   SCM specs = book_->get_system_specs ();
   for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s))
     {
-      if (Paper_score *ps = dynamic_cast<Paper_score *> (unsmob_music_output (scm_car (s))))
+      if (Paper_score *ps = dynamic_cast<Paper_score *> (Music_output::unsmob (scm_car (s))))
         {
           system_specs_.push_back (System_spec (ps));
         }
       else
         {
-          Prob *pb = unsmob_prob (scm_car (s));
+          Prob *pb = Prob::unsmob (scm_car (s));
           assert (pb);
 
           pb->protect ();
@@ -1169,9 +1172,8 @@ Page_breaking::min_page_count (vsize configuration, vsize first_page_num)
       cur_page_height -= min_whitespace_at_top_of_page (cached_line_details_[page_starter]);
       cur_page_height -= min_whitespace_at_bottom_of_page (cached_line_details_.back ());
 
-      Real cur_height = cur_rod_height + ((ragged_last () || ragged ()) ? cur_spring_height : 0);
       if (!too_few_lines (line_count - cached_line_details_.back ().compressed_nontitle_lines_count_)
-          && cur_height > cur_page_height
+          && cur_rod_height > cur_page_height
           /* don't increase the page count if the last page had only one system */
           && cur_rod_height > cached_line_details_.back ().full_height ())
         ret++;
@@ -1224,11 +1226,11 @@ Page_breaking::blank_page_penalty () const
   SCM penalty_sym;
 
   if (is_last ())
-    penalty_sym = ly_symbol2scm ("blank-last-page-force");
+    penalty_sym = ly_symbol2scm ("blank-last-page-penalty");
   else if (ends_score ())
-    penalty_sym = ly_symbol2scm ("blank-after-score-page-force");
+    penalty_sym = ly_symbol2scm ("blank-after-score-page-penalty");
   else
-    penalty_sym = ly_symbol2scm ("blank-page-force");
+    penalty_sym = ly_symbol2scm ("blank-page-penalty");
 
   Break_position const &pos = breaks_[current_end_breakpoint_];
   if (Paper_score *ps = system_specs_[pos.system_spec_index_].pscore_)
@@ -1437,7 +1439,9 @@ Page_breaking::finalize_spacing_result (vsize configuration, Page_spacing_result
       line_penalty += uncompressed_line_details_[i].break_penalty_;
     }
 
-  for (vsize i = 0; i < res.force_.size (); i++)
+  for (vsize i = ragged () ? res.force_.size () - 1 : 0;
+       i < res.force_.size () - ragged_last ();
+       i++)
     {
       Real f = res.force_[i];
 
@@ -1545,9 +1549,11 @@ Page_breaking::space_systems_on_2_pages (vsize configuration, vsize first_page_n
       page1_penalty[i] = line_count_penalty (page1_line_count);
       page1_status[i] = line_count_status (page1_line_count);
 
-      if (ragged2)
+      if (ragged1)
         page2_force[page2_force.size () - 1 - i]
           = (page2.force_ < 0 && i + 1 < page1_force.size ()) ? infinity_f : 0;
+      else if (ragged2 && page2.force_ > 0)
+        page2_force[page2_force.size () - 1 - i] = 0.0;
       else
         page2_force[page2_force.size () - 1 - i] = page2.force_;
       page2_penalty[page2_penalty.size () - 1 - i] = line_count_penalty (page2_line_count);