2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1997--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
27 #include "cpu-timer.hh"
28 #include "global-context.hh"
29 #include "international.hh"
30 #include "lily-parser.hh"
34 #include "output-def.hh"
35 #include "paper-book.hh"
36 #include "paper-score.hh"
39 #include "ly-smobs.icc"
42 Score::origin () const
44 return unsmob_input (input_location_
);
52 input_location_
= SCM_EOL
;
57 input_location_
= make_input (Input ());
64 IMPLEMENT_SMOBS (Score
);
65 IMPLEMENT_DEFAULT_EQUAL_P (Score
);
66 IMPLEMENT_TYPE_P (Score
, "ly:score?");
69 Score::mark_smob (SCM s
)
71 Score
*sc
= (Score
*) SCM_CELL_WORD_1 (s
);
73 scm_gc_mark (sc
->header_
);
74 for (vsize i
= sc
->defs_
.size (); i
--;)
75 scm_gc_mark (sc
->defs_
[i
]->self_scm ());
77 scm_gc_mark (sc
->input_location_
);
82 Score::print_smob (SCM
, SCM p
, scm_print_state
*)
84 scm_puts ("#<Score>", p
);
89 Score::Score (Score
const &s
)
93 input_location_
= SCM_EOL
;
94 error_found_
= s
.error_found_
;
97 input_location_
= make_input (*s
.origin ());
99 Music
*m
= unsmob_music (s
.music_
);
102 Music
*mclone
= m
->clone ();
103 music_
= mclone
->unprotect ();
108 for (vsize i
= 0, n
= s
.defs_
.size (); i
< n
; i
++)
110 Output_def
*copy
= s
.defs_
[i
]->clone ();
111 defs_
.push_back (copy
);
114 header_
= ly_make_anonymous_module (false);
115 if (ly_is_module (s
.header_
))
116 ly_module_copy (header_
, s
.header_
);
121 Format score, return list of Music_output objects.
123 LAYOUTBOOK should be scaled already.
126 Score::book_rendering (Output_def
*layoutbook
,
127 Output_def
*default_def
)
132 SCM scaled_bookdef
= SCM_EOL
;
135 if (layoutbook
&& layoutbook
->c_variable ("is-paper") == SCM_BOOL_T
)
136 scale
= scm_to_double (layoutbook
->c_variable ("output-scale"));
138 SCM outputs
= SCM_EOL
;
139 SCM
*tail
= &outputs
;
141 int outdef_count
= defs_
.size ();
143 for (int i
= 0; !i
|| i
< outdef_count
; i
++)
145 Output_def
*def
= outdef_count
? defs_
[i
] : default_def
;
146 SCM scaled
= SCM_EOL
;
148 if (def
->c_variable ("is-layout") == SCM_BOOL_T
)
150 def
= scale_output_def (def
, scale
);
151 def
->parent_
= layoutbook
;
153 scaled
= def
->unprotect ();
156 /* TODO: fix or junk --no-layout. */
157 SCM context
= ly_run_translator (music_
, def
->self_scm ());
158 if (dynamic_cast<Global_context
*> (unsmob_context (context
)))
160 SCM s
= ly_format_output (context
);
162 *tail
= scm_cons (s
, SCM_EOL
);
163 tail
= SCM_CDRLOC (*tail
);
166 scm_remember_upto_here_1 (scaled
);
169 scm_remember_upto_here_1 (scaled_bookdef
);
174 Score::set_music (SCM music
)
176 if (unsmob_music (music_
))
178 unsmob_music (music
)->origin ()->error (_ ("already have music in score"));
179 unsmob_music (music_
)->origin ()->error (_ ("this is the previous music"));
181 Music
*m
= unsmob_music (music
);
182 if (m
&& to_boolean (m
->get_property ("error-found")))
184 m
->origin ()->error (_ ("errors found, ignoring music expression"));
186 this->error_found_
= this->error_found_
187 || to_boolean (m
->get_property ("error-found"));
190 if (this->error_found_
)
191 this->music_
= SCM_EOL
;
193 this->music_
= music
;
197 Score::get_music () const
203 Score::add_output_def (Output_def
*def
)
205 defs_
.push_back (def
);
209 Score::get_header () const
215 Score::set_header (SCM module
)
217 assert (ly_is_module (module
));