]> git.donarmstrong.com Git - lilypond.git/blob - lily/paper-score.cc
* lily/system.cc (uniquify_list): new function
[lilypond.git] / lily / paper-score.cc
1 /*
2   paper-score.cc -- implement Paper_score
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "score.hh"
10 #include "main.hh"
11 #include "warn.hh"
12 #include "font-metric.hh"
13 #include "spanner.hh"
14 #include "paper-def.hh"
15 #include "system.hh"
16 #include "paper-column.hh"
17 #include "paper-score.hh"
18 #include "paper-column.hh"
19 #include "scm-hash.hh"
20 #include "gourlay-breaking.hh"
21 #include "paper-outputter.hh"
22 #include "input-file-results.hh"
23 #include "misc.hh"
24 #include "all-font-metrics.hh"
25
26 Paper_score::Paper_score ()
27 {
28   paper_ =0;
29   outputter_ =0;
30   system_ = 0;
31   main_smob_ = SCM_EOL;
32 }
33
34 void
35 Paper_score::typeset_line (System *l)
36 {
37   if (!system_)
38     {
39       system_ = l;              // ugh.
40     }
41
42   main_smob_ = gh_cons (l->self_scm (), main_smob_);
43   l->pscore_ = this;
44
45 #if 0
46   /*
47     We don't unprotect l->self_scm (), we haven't got any place else to
48     protect it from collection.  */
49 #endif
50
51   scm_gc_unprotect_object (l->self_scm());
52 }
53
54 Paper_score::Paper_score (Paper_score const &s)
55   : Music_output (s)
56 {
57   assert (false);
58 }
59
60 Array<Column_x_positions>
61 Paper_score::calc_breaking ()
62 {
63   Break_algorithm *algorithm=0;
64   Array<Column_x_positions> sol;
65
66   algorithm = new Gourlay_breaking ;
67   algorithm->set_pscore (this);
68   sol = algorithm->solve ();
69   delete algorithm;
70
71   return sol;
72 }
73
74 /*
75   urg. clean me
76  */
77 void
78 Paper_score::process (String outname)
79 {
80   if (verbose_global_b)
81     progress_indication (_f ("Element count %d (spanners %d) ",
82                              system_->element_count (),
83                              system_->spanner_count ()));
84
85   
86   progress_indication (_ ("Preprocessing graphical objects...") + " ");
87
88   /*
89     Be sure to set breakability on first & last column.
90    */
91   Link_array<Grob> pc (system_->columns ());
92   
93   pc[0]->set_grob_property ("breakable", SCM_BOOL_T);
94   pc.top ()->set_grob_property ("breakable", SCM_BOOL_T);
95
96   system_->pre_processing ();
97  
98   Array<Column_x_positions> breaking = calc_breaking ();
99   system_->break_into_pieces (breaking);
100   
101   outputter_ = paper_->get_paper_outputter (outname);
102   outputter_->output_header ();
103   outputter_->output_version ();
104
105   progress_indication ("\n");
106
107   if (global_input_file->header_)
108     {
109       outputter_->output_scope (global_input_file->header_, "lilypond");
110       outputter_->write_header_fields_to_file (global_input_file->header_);
111     }
112   
113   if (header_)
114     {
115       outputter_->output_scope (header_, "lilypond");
116       outputter_->write_header_fields_to_file (header_);
117     }
118
119   outputter_->output_scope (paper_->scope_, "lilypondpaper");
120
121   SCM scm = scm_list_n (ly_symbol2scm ("header-end"), SCM_UNDEFINED);
122   outputter_->output_scheme (scm);
123
124   system_->output_lines ();
125
126   scm = scm_list_n (ly_symbol2scm ("end-output"), SCM_UNDEFINED);
127   outputter_->output_scheme (scm);
128
129   progress_indication ("\n");
130
131   // huh?
132   delete outputter_;
133   outputter_ = 0;
134   
135   if (verbose_global_b)
136     {
137       scm_write (scm_gc_stats (), scm_current_error_port ());
138       scm_flush (scm_current_error_port ());
139     }
140 }