]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix 1203.
authorJoe Neeman <joeneeman@gmail.com>
Mon, 9 Aug 2010 19:55:23 +0000 (12:55 -0700)
committerJoe Neeman <joeneeman@gmail.com>
Mon, 9 Aug 2010 20:45:27 +0000 (13:45 -0700)
Allows markup lines and titles to have page turns after them.

lily/include/page-breaking.hh
lily/minimal-page-breaking.cc
lily/optimal-page-breaking.cc
lily/page-breaking.cc
lily/page-turn-page-breaking.cc

index 3c4076c0daa79ae9d63afa1c015f9870b5b4015a..58c8de0951a93d82b208b15901a01ff0d36081c1 100644 (file)
@@ -99,6 +99,7 @@ class Page_breaking
 {
 public:
   typedef bool (*Break_predicate) (Grob *);
+  typedef bool (*Prob_break_predicate) (Prob *);
   typedef vector<vsize> Line_division;
   
   /*
@@ -109,7 +110,7 @@ public:
    */
   virtual SCM solve () = 0;
 
-  Page_breaking (Paper_book *pb, Break_predicate);
+  Page_breaking (Paper_book *pb, Break_predicate, Prob_break_predicate);
   virtual ~Page_breaking ();
 
   bool ragged () const;
@@ -213,7 +214,7 @@ private:
   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);
+  void find_chunks_and_breaks (Break_predicate, Prob_break_predicate);
   SCM make_page (int page_num, bool last) const;
   SCM get_page_configuration (SCM systems, int page_num, bool ragged, bool last);
   SCM draw_page (SCM systems, SCM config, int page_num, bool last);
index 1f4cb4d686cbb92d9d8142aba3a588dea7791d90..2e612185e5d27ae8492a6f50cc91b6606dfa0c08 100644 (file)
 #include "page-spacing.hh"
 #include "paper-book.hh"
 
-static bool
-is_break (Grob *)
-{
-  return false;
-}
-
 Minimal_page_breaking::Minimal_page_breaking (Paper_book *pb)
-  : Page_breaking (pb, is_break)
+  : Page_breaking (pb, 0, 0)
 {
 }
 
index 29d5ee63e99ac2c2bfbda26bcd8383b79e61ad0d..60dddd421283783d63204420302ed73c913b67ee 100644 (file)
 #include "prob.hh"
 #include "system.hh"
 
-static bool
-is_break (Grob *)
-{
-  return false;
-}
-
 Optimal_page_breaking::Optimal_page_breaking (Paper_book *pb)
-  : Page_breaking (pb, is_break)
+  : Page_breaking (pb, 0, 0)
 {
 }
 
index aeeb7bb1b7eb555db4f37ea162524178d72c8050..4c7c40763ebe942d7131d7df91af7d335a10775b 100644 (file)
@@ -173,7 +173,7 @@ Page_breaking::next_system (Break_position const &break_pos) const
   return sys + 1; /* this page starts with a new System_spec */
 }
 
-Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break)
+Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break, Prob_break_predicate prob_break)
 {
   book_ = pb;
   system_count_ = 0;
@@ -196,7 +196,7 @@ Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break)
     }
 
   create_system_list ();
-  find_chunks_and_breaks (is_break);
+  find_chunks_and_breaks (is_break, prob_break);
 }
 
 Page_breaking::~Page_breaking ()
@@ -523,7 +523,7 @@ Page_breaking::create_system_list ()
 }
 
 void
-Page_breaking::find_chunks_and_breaks (Break_predicate is_break)
+Page_breaking::find_chunks_and_breaks (Break_predicate is_break, Prob_break_predicate prob_is_break)
 {
   SCM force_sym = ly_symbol2scm ("force");
 
@@ -567,7 +567,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break)
                }
 
              bool last = (j == cols.size () - 1);
-             bool break_point = is_break (cols[j]);
+             bool break_point = is_break && is_break (cols[j]);
              bool chunk_end = cols[j]->get_property ("page-break-permission") == force_sym;
              Break_position cur_pos = Break_position (i,
                                                       line_breaker_columns.size (),
@@ -598,8 +598,8 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break)
        }
       else
        {
-         /* TODO: we want some way of applying Break_p to a prob? */
-         if (i == system_specs_.size () - 1)
+         bool break_point = prob_is_break && prob_is_break (system_specs_[i].prob_);
+         if (break_point || i == system_specs_.size () - 1)
            breaks_.push_back (Break_position (i));
 
          chunks_.push_back (Break_position (i));
index 54b3bbc566216c96b399890ff692bd6940a81358..9338a38bfc4a38acefaeda217c3e89f69514fb65 100644 (file)
@@ -29,8 +29,9 @@
 #include "system.hh"
 #include "warn.hh"
 
+template<typename T>
 static bool
-is_break (Grob *g)
+is_break (T *g)
 {
   bool turnable = scm_is_symbol (g->get_property ("page-turn-permission"));
 
@@ -46,7 +47,7 @@ is_break (Grob *g)
 }
 
 Page_turn_page_breaking::Page_turn_page_breaking (Paper_book *pb)
-  : Page_breaking (pb, is_break)
+  : Page_breaking (pb, is_break<Grob>, is_break<Prob>)
 {
 }