]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/paper-book.cc
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond into...
[lilypond.git] / lily / paper-book.cc
index 907ff1bd776f5b14af0668ad112928fb098fd79f..3db1321f5e495b199915d39007a937638b71f76d 100644 (file)
@@ -3,12 +3,13 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "paper-book.hh"
 
 #include "grob.hh"
+#include "international.hh"
 #include "main.hh"
 #include "output-def.hh"
 #include "paper-column.hh"
@@ -32,6 +33,7 @@ Paper_book::Paper_book ()
   systems_ = SCM_BOOL_F;
 
   paper_ = 0;
+  parent_ = 0;
   smobify_self ();
 }
 
@@ -49,6 +51,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,52 +109,49 @@ Paper_book::add_performance (SCM s)
   performances_ = scm_cons (s, performances_);
 }
 
-void
+int
 Paper_book::output_aux (SCM output_channel,
-                        bool is_first,
-                        bool is_last,
-                        int *first_page_number,
-                        int *first_performance_number)
+                       bool is_last,
+                       int *first_page_number,
+                       int *first_performance_number)
 {
+  int page_nb = 0;
   if (scm_is_pair (performances_))
     {
       SCM proc = ly_lily_module_constant ("write-performances-midis");
  
       scm_call_3 (proc,
-                  performances (),
-                  output_channel,
-                  scm_long2num (*first_performance_number));
+                 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;
-      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)));
-            pbookpart->output_aux (output_channel,
-                                   is_first_part,
-                                   is_last_part,
-                                   first_page_number,
-                                   first_performance_number);
-            is_first_part = false;
-          }
+      for (SCM p = 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_nb += pbookpart->output_aux (output_channel,
+                                             is_last_part,
+                                             first_page_number,
+                                             first_performance_number);
+         }
     }
   else
     {
       if (scores_ == SCM_EOL)
-        return;
-      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 0;
+      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.  */
-      *first_page_number += scm_ilength (pages ());
+      page_nb = scm_ilength (pages ());
+      *first_page_number += page_nb;
     }
+  return page_nb;
 }
 
 void
@@ -158,12 +159,12 @@ 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,
-              true,
-              true,
-              &first_page_number,
-              &first_performance_number);
-
+  if (!output_aux (output_channel,
+                  true,
+                  &first_page_number,
+                  &first_performance_number))
+    return;
+      
   SCM scopes = SCM_EOL;
   if (ly_is_module (header_))
     scopes = scm_cons (header_, scopes);
@@ -174,39 +175,52 @@ Paper_book::output (SCM output_channel)
 
   if (get_program_option ("print-pages"))
     {
-      SCM func = scm_c_module_lookup (mod, "output-framework");
-
-      func = scm_variable_ref (func);
-      scm_apply_0 (func, scm_list_n (output_channel,
-                                    self_scm (),
-                                    scopes,
-                                    dump_fields (),
-                                    SCM_UNDEFINED));
+      SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-framework"));
+
+      if (framework != SCM_BOOL_F)
+       {
+         SCM func = scm_variable_ref (framework);
+         scm_apply_0 (func, scm_list_n (output_channel,
+                                        self_scm (),
+                                        scopes,
+                                        dump_fields (),
+                                        SCM_UNDEFINED));
+       }
+      else
+       warning (_f ("program option -dprint-pages not supported by backend `%s'",
+                    get_output_backend_name ()));
     }
 
   if (get_program_option ("preview"))
     {
-      SCM func = scm_c_module_lookup (mod, "output-preview-framework");
-      func = scm_variable_ref (func);
-      scm_apply_0 (func, scm_list_n (output_channel,
-                                    self_scm (),
-                                    scopes,
-                                    dump_fields (),
-                                    SCM_UNDEFINED));
+      SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-preview-framework"));
+
+      if (framework != SCM_BOOL_F)
+       {
+         SCM func = scm_variable_ref (framework);
+         scm_apply_0 (func, scm_list_n (output_channel,
+                                        self_scm (),
+                                        scopes,
+                                        dump_fields (),
+                                        SCM_UNDEFINED));
+       }
+      else
+       warning (_f ("program option -dpreview not supported by backend `%s'",
+                    get_output_backend_name ()));
     }
 }
 
 void
 Paper_book::classic_output_aux (SCM output,
-                                int *first_performance_number)
+                               int *first_performance_number)
 {
   if (scm_is_pair (performances_))
     {
       SCM proc = ly_lily_module_constant ("write-performances-midis");
       scm_call_3 (proc,
-                  performances (),
-                  output,
-                  scm_long2num (*first_performance_number));
+                 performances (),
+                 output,
+                 scm_long2num (*first_performance_number));
       *first_performance_number += scm_ilength (performances_);
     }
   
@@ -521,52 +535,52 @@ Paper_book::systems ()
   systems_ = SCM_EOL;
   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 ()));
+      for (SCM p = 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 ()));
     }
   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_;
@@ -581,26 +595,29 @@ Paper_book::pages ()
   pages_ = SCM_EOL;
   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 ()));
+      for (SCM p = 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 ()));
     }
-  else
+  else if (scm_is_pair (scores_))
     {
-      SCM proc = paper_->c_variable ("page-breaking-wrapper");
-      pages_ = scm_apply_0 (proc, scm_list_1 (self_scm ()));
+      SCM page_breaking = paper_->c_variable ("page-breaking");
+      pages_ = scm_apply_0 (page_breaking, scm_list_1 (self_scm ()));
+      SCM post_process = paper_->c_variable ("page-post-process");
+      if (ly_is_procedure (post_process))
+       scm_apply_2 (post_process, paper_->self_scm (), pages_, SCM_EOL);
 
       /* 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_;
 }