]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/paper-book.cc
Run `make grand-replace'.
[lilypond.git] / lily / paper-book.cc
index 43e2012043a8fd48ef10fb65c2e40ee0b9d4db28..5f9d60c5768ae40c916a1a14e832b784be66dc90 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "paper-book.hh"
@@ -32,6 +32,7 @@ Paper_book::Paper_book ()
   systems_ = SCM_BOOL_F;
 
   paper_ = 0;
+  parent_ = 0;
   smobify_self ();
 }
 
@@ -49,6 +50,8 @@ Paper_book::mark_smob (SCM smob)
   Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob);
   if (b->paper_)
     scm_gc_mark (b->paper_->self_scm ());
+  if (b->parent_)
+    scm_gc_mark (b->parent_->self_scm ());
   scm_gc_mark (b->header_);
   scm_gc_mark (b->header_0_);
   scm_gc_mark (b->pages_);
@@ -105,57 +108,57 @@ Paper_book::add_performance (SCM s)
   performances_ = scm_cons (s, performances_);
 }
 
-int
+void
 Paper_book::output_aux (SCM output_channel,
-                        int first_page_number,
-                        bool is_first,
-                        bool is_last)
+                       bool is_last,
+                       int *first_page_number,
+                       int *first_performance_number)
 {
   if (scm_is_pair (performances_))
     {
       SCM proc = ly_lily_module_constant ("write-performances-midis");
  
-      scm_call_2 (proc, performances (), output_channel);
+      scm_call_3 (proc,
+                 performances (),
+                 output_channel,
+                 scm_long2num (*first_performance_number));
+      *first_performance_number += scm_ilength (performances_);
     }
 
   if (scm_is_pair (bookparts_))
     {
-      bool is_first_part = is_first;
-      int page_number = first_page_number;
       for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
-        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
-          {
-            bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p)));
-            page_number += pbookpart->output_aux (output_channel,
-                                                  page_number,
-                                                  is_first_part,
-                                                  is_last_part);
-            is_first_part = false;
-          }
-      return page_number;
+       if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
+         {
+           bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p)));
+           pbookpart->output_aux (output_channel,
+                                  is_last_part,
+                                  first_page_number,
+                                  first_performance_number);
+         }
     }
   else
     {
       if (scores_ == SCM_EOL)
-        return 0;
-      paper_->set_variable (ly_symbol2scm ("part-first-page-number"),
-                            scm_long2num (first_page_number));
-      paper_->set_variable (ly_symbol2scm ("part-is-first"),
-                            ly_bool2scm (is_first));
-      paper_->set_variable (ly_symbol2scm ("part-is-last"),
-                            ly_bool2scm (is_last));
+       return;
+      paper_->set_variable (ly_symbol2scm ("first-page-number"),
+                           scm_long2num (*first_page_number));
+      paper_->set_variable (ly_symbol2scm ("is-last-bookpart"),
+                           ly_bool2scm (is_last));
       /* Generate all stencils to trigger font loads.  */
-      return scm_ilength (pages ());
+      *first_page_number += scm_ilength (pages ());
     }
 }
 
 void
 Paper_book::output (SCM output_channel)
 {
+  int first_page_number = robust_scm2int (paper_->c_variable ("first-page-number"), 1);
+  int first_performance_number = 0;
   output_aux (output_channel,
-              robust_scm2int (paper_->c_variable ("first-page-number"), 1),
-              true,
-              true);
+             true,
+             &first_page_number,
+             &first_performance_number);
 
   SCM scopes = SCM_EOL;
   if (ly_is_module (header_))
@@ -190,13 +193,17 @@ Paper_book::output (SCM output_channel)
 }
 
 void
-Paper_book::classic_output_aux (SCM output)
+Paper_book::classic_output_aux (SCM output,
+                               int *first_performance_number)
 {
   if (scm_is_pair (performances_))
     {
       SCM proc = ly_lily_module_constant ("write-performances-midis");
-      scm_call_2 (proc, performances (), output);
+      scm_call_3 (proc,
+                 performances (),
+                 output,
+                 scm_long2num (*first_performance_number));
+      *first_performance_number += scm_ilength (performances_);
     }
   
   /* Generate all stencils to trigger font loads.  */
@@ -206,7 +213,8 @@ Paper_book::classic_output_aux (SCM output)
 void
 Paper_book::classic_output (SCM output)
 {
-  classic_output_aux (output);
+  int first_performance_number = 0;
+  classic_output_aux (output, &first_performance_number);
 
   SCM scopes = SCM_EOL;
   if (ly_is_module (header_))
@@ -381,18 +389,15 @@ Paper_book::get_system_specs ()
 {
   SCM system_specs = SCM_EOL;
   
-  if (ly_scm2bool (paper_->c_variable ("part-is-first")))
+  Stencil title = book_title ();
+  if (!title.is_empty ())
     {
-      Stencil title = book_title ();
-      if (!title.is_empty ())
-        {
-          SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties"));
-          Prob *ps = make_paper_system (props);
-          paper_system_set_stencil (ps, title);
-          
-          system_specs = scm_cons (ps->self_scm (), system_specs);
-          ps->unprotect ();
-        }
+      SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties"));
+      Prob *ps = make_paper_system (props);
+      paper_system_set_stencil (ps, title);
+      
+      system_specs = scm_cons (ps->self_scm (), system_specs);
+      ps->unprotect ();
     }
 
   SCM page_properties
@@ -513,51 +518,51 @@ Paper_book::systems ()
   if (scm_is_pair (bookparts_))
     {
       for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
-        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
-          systems_ = scm_append_x (scm_list_2 (systems_, pbookpart->systems ()));
+       if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
+         systems_ = scm_append_x (scm_list_2 (systems_, pbookpart->systems ()));
     }
   else
     {
       SCM specs = get_system_specs ();
       for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s))
-        {
-          if (Paper_score *pscore = dynamic_cast<Paper_score*> (unsmob_music_output (scm_car (s))))
-            {
-              SCM system_list = scm_vector_to_list (pscore->get_paper_systems ());
-              system_list = scm_reverse (system_list);
-              systems_ = scm_append (scm_list_2 (system_list, systems_));
-            }
-          else
-            {
-              systems_ = scm_cons (scm_car (s), systems_);
-            }
-        }
+       {
+         if (Paper_score *pscore = dynamic_cast<Paper_score*> (unsmob_music_output (scm_car (s))))
+           {
+             SCM system_list = scm_vector_to_list (pscore->get_paper_systems ());
+             system_list = scm_reverse (system_list);
+             systems_ = scm_append (scm_list_2 (system_list, systems_));
+           }
+         else
+           {
+             systems_ = scm_cons (scm_car (s), systems_);
+           }
+       }
       systems_ = scm_reverse (systems_);
 
       /* backwards compatibility for the old page breaker */
       int i = 0;
       Prob *last = 0;
       for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s))
-        {
-          Prob *ps = unsmob_prob (scm_car (s));
-          ps->set_property ("number", scm_from_int (++i));
-          
-          if (last
-              && to_boolean (last->get_property ("is-title"))
-              && !scm_is_number (ps->get_property ("penalty")))
-            ps->set_property ("penalty", scm_from_int (10000));
-          last = ps;
-          
-          if (scm_is_pair (scm_cdr (s)))
-            {
-              SCM perm = ps->get_property ("page-break-permission");
-              Prob *next = unsmob_prob (scm_cadr (s));
-              if (perm == SCM_EOL)
-                next->set_property ("penalty", scm_from_int (10001));
-              else if (perm == ly_symbol2scm ("force"))
-                next->set_property ("penalty", scm_from_int (-10001));
-            }
-        }
+       {
+         Prob *ps = unsmob_prob (scm_car (s));
+         ps->set_property ("number", scm_from_int (++i));
+         
+         if (last
+             && to_boolean (last->get_property ("is-title"))
+             && !scm_is_number (ps->get_property ("penalty")))
+           ps->set_property ("penalty", scm_from_int (10000));
+         last = ps;
+         
+         if (scm_is_pair (scm_cdr (s)))
+           {
+             SCM perm = ps->get_property ("page-break-permission");
+             Prob *next = unsmob_prob (scm_cadr (s));
+             if (perm == SCM_EOL)
+               next->set_property ("penalty", scm_from_int (10001));
+             else if (perm == ly_symbol2scm ("force"))
+               next->set_property ("penalty", scm_from_int (-10001));
+           }
+       }
     }
 
   return systems_;
@@ -573,8 +578,8 @@ Paper_book::pages ()
   if (scm_is_pair (bookparts_))
     {
       for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
-        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
-          pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ()));
+       if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
+         pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ()));
     }
   else
     {
@@ -583,15 +588,15 @@ Paper_book::pages ()
 
       /* set systems_ from the pages */
       if (systems_ == SCM_BOOL_F)
-        {
-          systems_ = SCM_EOL;
-          for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p))
-            {
-              Prob *page = unsmob_prob (scm_car (p));
-              SCM systems = page->get_property ("lines");
-              systems_ = scm_append (scm_list_2 (systems_, systems));
-            }
-        }
+       {
+         systems_ = SCM_EOL;
+         for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p))
+           {
+             Prob *page = unsmob_prob (scm_car (p));
+             SCM systems = page->get_property ("lines");
+             systems_ = scm_append (scm_list_2 (systems_, systems));
+           }
+       }
     }
   return pages_;
 }