]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-breaking.cc
Cleanups in one-line-page-breaking.
[lilypond.git] / lily / page-breaking.cc
index 36ef0a13726d621f9888cd14e854ea5260bd945e..692244b897063daab340b814da73529beee58642 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2006--2011 Joe Neeman <joeneeman@gmail.com>
+  Copyright (C) 2006--2012 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
@@ -254,11 +254,11 @@ Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break, Prob_bre
   min_systems_per_page_ = max (0, robust_scm2int (pb->paper_->c_variable ("min-systems-per-page"), 0));
   orphan_penalty_ = robust_scm2int (pb->paper_->c_variable ("orphan-penalty"), 100000);
 
-  Stencil *footnote_separator = Page_layout_problem::get_footnote_separator_stencil (pb->paper_);
+  Stencil footnote_separator = Page_layout_problem::get_footnote_separator_stencil (pb->paper_);
 
-  if (footnote_separator)
+  if (!footnote_separator.is_empty ())
     {
-      Interval separator_extent = footnote_separator->extent (Y_AXIS);
+      Interval separator_extent = footnote_separator.extent (Y_AXIS);
       Real separator_span = separator_extent.length ();
 
       footnote_separator_stencil_height_ = separator_span;
@@ -466,7 +466,7 @@ Page_breaking::systems ()
           pb->unprotect ();
         }
     }
-  return scm_append (scm_reverse (ret));
+  return scm_append (scm_reverse_x (ret, SCM_EOL));
 }
 
 SCM
@@ -552,7 +552,7 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las
 {
   // Create a stencil for each system.
   SCM paper_systems = SCM_EOL;
-  for (SCM s = scm_reverse (systems); scm_is_pair (s); s = scm_cdr (s))
+  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)))
@@ -563,26 +563,23 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las
 
       paper_systems = scm_cons (paper_system, paper_systems);
     }
+  paper_systems = scm_reverse_x (paper_systems, SCM_EOL);
 
   // Create the page and draw it.
   SCM page = make_page (page_num, last);
-  SCM page_module = scm_c_resolve_module ("scm page");
-  SCM page_stencil = scm_c_module_lookup (page_module, "page-stencil");
-  page_stencil = scm_variable_ref (page_stencil);
 
   Prob *p = unsmob_prob (page);
   p->set_property ("lines", paper_systems);
   p->set_property ("configuration", configuration);
 
-  Stencil *foot = unsmob_stencil (p->get_property ("foot-stencil"));
+  Stencil *foot_p = unsmob_stencil (p->get_property ("foot-stencil"));
+  Stencil foot = foot_p ? *foot_p : Stencil ();
 
   SCM footnotes = Page_layout_problem::get_footnotes_from_lines (systems);
 
-  Page_layout_problem::add_footnotes_to_footer (footnotes, foot, book_);
+  foot = Page_layout_problem::add_footnotes_to_footer (footnotes, foot, book_);
 
-  if (foot)
-    p->set_property ("foot-stencil", foot->smobbed_copy ());
-  scm_apply_1 (page_stencil, page, SCM_EOL);
+  p->set_property ("foot-stencil", foot.smobbed_copy ());
 
   return page;
 }
@@ -602,10 +599,11 @@ Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
     label_page_table = SCM_EOL;
 
   // Build a list of (systems configuration . footnote-count) triples.
-  // Note that we lay out
-  // the staves and find the configurations before drawing anything. Some
+  // Note that we lay out the staves and find the configurations,
+  // but we do not draw anything in this function.  It is important
+  // that all staves are laid out vertically before any are drawn; some
   // grobs (like tuplet brackets) look at their neighbours while drawing
-  // themselves. If this happens before the neighbouring staves have
+  // themselves.  If this happens before the neighbouring staves have
   // been laid out, bad side-effects could happen (in particular,
   // Align_interface::align_to_ideal_distances might be called).
   SCM systems_configs_fncounts = SCM_EOL;
@@ -641,7 +639,9 @@ Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
       systems = scm_list_tail (systems, line_count);
     }
 
-  // Now it's safe to make the pages.
+  // TODO: previously, the following loop caused the systems to be
+  // drawn.  Now that we no longer draw anything in Page_breaking,
+  // it is safe to merge these two loops.
   int page_num = first_page_number + lines_per_page.size () - 1;
   for (SCM s = systems_configs_fncounts; scm_is_pair (s); s = scm_cdr (s))
     {
@@ -680,14 +680,6 @@ Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
   return ret;
 }
 
-/* The page-turn-page-breaker needs to have a line-breaker between any two
-   columns with non-NULL page-turn-permission.
-
-   The optimal-breaker needs to have a line-breaker between any two columns
-   with page-break-permission = 'force.
-
-   By using a grob predicate, we can accommodate both of these uses.
-*/
 void
 Page_breaking::create_system_list ()
 {
@@ -711,6 +703,14 @@ Page_breaking::create_system_list ()
     system_specs_.push_back (System_spec ());
 }
 
+/* The page-turn-page-breaker needs to have a line-breaker between any two
+   columns with non-NULL page-turn-permission.
+
+   The optimal-breaker needs to have a line-breaker between any two columns
+   with page-break-permission = 'force.
+
+   By using a grob predicate, we can accommodate both of these uses.
+*/
 void
 Page_breaking::find_chunks_and_breaks (Break_predicate is_break, Prob_break_predicate prob_is_break)
 {