]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/paper-outputter.cc
* lily/stencil-scheme.cc (ly:stencil-expr): Rename (was:
[lilypond.git] / lily / paper-outputter.cc
index 009eb381e147d2863f8075d1c20e04b3bec02d30..8de4a29e167e20525238a5edc7ae5abfa3ceb3bf 100644 (file)
 #include "array.hh"
 #include "dimensions.hh"
 #include "font-metric.hh"
-#include "input-file-results.hh"
 #include "input-smob.hh"
 #include "lily-guile.hh"
 #include "lily-version.hh"
 #include "ly-module.hh"
 #include "main.hh"
+#include "page.hh"
 #include "paper-book.hh"
 #include "paper-def.hh"
 #include "paper-line.hh"
 #include "paper-outputter.hh"
+#include "file-name.hh"
 #include "scm-hash.hh"
 #include "stencil.hh"
 #include "string-convert.hh"
 #include "warn.hh"
 
+// JUNKME
+extern SCM stencil2line (Stencil* stil, bool is_title = false);
 
 Paper_outputter::Paper_outputter (String filename)
 {
-  if (safe_global_b)
-    scm_define (ly_symbol2scm ("safe-mode?"), SCM_BOOL_T);      
-  
+  filename_ = filename;
   file_ = scm_open_file (scm_makfrom0str (filename.to_str0 ()),
                         scm_makfrom0str ("w"));
 
+  if (safe_global_b)
+    scm_define (ly_symbol2scm ("safe-mode?"), SCM_BOOL_T);      
+
   String module_name = "scm output-" + output_format_global;
   if (safe_global_b)
     {
@@ -117,11 +121,15 @@ Paper_outputter::output_metadata (Paper_def *paper, SCM scopes)
     fields
       = scm_cons (ly_symbol2scm (dump_header_fieldnames_global[i].to_str0 ()),
                 fields);
+
+  File_name file_name (filename_);
+  file_name.ext_ = "";
+  String basename = file_name.to_string ();
   output_scheme (scm_list_n (ly_symbol2scm ("output-scopes"),
                             paper->self_scm (),
                             ly_quote_scm (scopes),
                             ly_quote_scm (fields),
-                            scm_makfrom0str (basename_.to_str0 ()), 
+                            scm_makfrom0str (basename.to_str0 ()), 
                             SCM_UNDEFINED));
 }
 
@@ -162,11 +170,12 @@ Paper_outputter::output_header (Paper_def *paper, SCM scopes, int page_count,
 void
 Paper_outputter::output_line (SCM line, Offset *origin, bool is_last)
 {
-  Paper_line *pl = unsmob_paper_line (line);
-  Offset dim = pl->dim ();
+  Paper_line *p = unsmob_paper_line (line);
+  Offset dim = p->dim ();
   if (dim[Y_AXIS] > 50 CM)
     {
-      programming_error ("Improbable system height.");
+      programming_error (to_string ("Improbable line height: %f",
+                                   dim[Y_AXIS]));
       dim[Y_AXIS] = 50 CM;
     }
 
@@ -174,20 +183,41 @@ Paper_outputter::output_line (SCM line, Offset *origin, bool is_last)
                             ly_quote_scm (ly_offset2scm (*origin)),
                             ly_quote_scm (ly_offset2scm (dim))));
 
-  for (SCM s = pl->stencils (); is_pair (s); s = ly_cdr (s))
-    output_expr (unsmob_stencil (ly_car (s))->get_expr (), Offset (0, 0));
+  output_stencil (unsmob_stencil (p->to_stencil ()));
 
+  (*origin)[Y_AXIS] += dim[Y_AXIS];
   output_scheme (scm_list_2 (ly_symbol2scm ("stop-system"),
                             ly_bool2scm (is_last)));
+}
 
-  (*origin)[Y_AXIS] += dim[Y_AXIS];
+void
+Paper_outputter::output_page (Page *p, bool is_last)
+{
+  output_scheme (scm_list_1 (ly_symbol2scm ("start-page")));
+
+  output_scheme (scm_list_3 (ly_symbol2scm ("start-system"),
+                            ly_quote_scm (ly_offset2scm (Offset (0, 0))),
+                            ly_quote_scm (ly_offset2scm (Offset (0, 0)))));
+
+  output_stencil (unsmob_stencil (p->to_stencil ()));
+
+  output_scheme (scm_list_2 (ly_symbol2scm ("stop-system"), SCM_BOOL_T));
+  output_scheme (scm_list_2 (ly_symbol2scm ("stop-page"),
+                            ly_bool2scm (is_last
+                                         && !unsmob_stencil (p->footer_))));
 }
 
 void
-Paper_outputter::output_music_output_def (Music_output_defodef)
+Paper_outputter::output_music_output_def (Music_output_def *odef)
 {
-  output_scheme (scm_list_n (ly_symbol2scm ("output-paper-def"),
-                            odef->self_scm (), SCM_UNDEFINED));
+  output_scheme (scm_list_2 (ly_symbol2scm ("output-paper-def"),
+                             odef->self_scm ()));
+}
+
+void
+Paper_outputter::output_stencil (Stencil *stil)
+{
+  output_expr (stil->expr (), stil->origin ());
 }
 
 /* TODO: replaceme/rewriteme, see output-ps.scm: output-stencil  */
@@ -196,24 +226,23 @@ Paper_outputter::output_expr (SCM expr, Offset o)
 {
   while (1)
     {
-      if (!is_pair (expr))
+      if (!ly_c_pair_p (expr))
        return;
   
       SCM head =ly_car (expr);
       if (unsmob_input (head))
        {
-         Input * ip = unsmob_input (head);
-      
-         output_scheme (scm_list_n (ly_symbol2scm ("define-origin"),
-                                    scm_makfrom0str (ip->file_string ().to_str0 ()),
-                                    scm_int2num (ip->line_number ()),
-                                    scm_int2num (ip->column_number ()),
-                                    SCM_UNDEFINED));
+         Input *ip = unsmob_input (head);
+         output_scheme (scm_list_4 (ly_symbol2scm ("define-origin"),
+                                     scm_makfrom0str (ip->file_string ()
+                                                      .to_str0 ()),
+                                     scm_int2num (ip->line_number ()),
+                                     scm_int2num (ip->column_number ())));
          expr = ly_cadr (expr);
        }
       else  if (head ==  ly_symbol2scm ("no-origin"))
        {
-         output_scheme (scm_list_n (head, SCM_UNDEFINED));
+         output_scheme (scm_list_1 (head));
          expr = ly_cadr (expr);
        }
       else if (head == ly_symbol2scm ("translate-stencil"))
@@ -228,13 +257,11 @@ Paper_outputter::output_expr (SCM expr, Offset o)
        }
       else
        {
-         output_scheme (scm_list_n (ly_symbol2scm ("placebox"),
+         output_scheme (scm_list_4 (ly_symbol2scm ("placebox"),
                                     scm_make_real (o[X_AXIS]),
                                     scm_make_real (o[Y_AXIS]),
-                                    expr,
-                                    SCM_UNDEFINED));
+                                    expr));
          return;
        }
     }
 }
-