X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore.cc;h=eabb2fde9028dbcb24ae513241b0c0eeb07e9e8f;hb=7e72a1e50e94a7f9738d62599de79fe7745f600c;hp=5dac6960869f16ae5024ca9aefa9f694ae2d8c51;hpb=6a1295eaacbc3e6b5a7ce19f7f942b23f8d7f2ff;p=lilypond.git diff --git a/lily/score.cc b/lily/score.cc index 5dac696086..eabb2fde90 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -3,149 +3,184 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ +#include + +#include "ly-smobs.icc" + #include "score.hh" -#include "debug.hh" +#include "warn.hh" #include "music-output-def.hh" #include "music-output.hh" -#include "source.hh" -#include "source-file.hh" #include "music-iterator.hh" #include "music.hh" #include "global-translator.hh" -#include "header.hh" +#include "scm-hash.hh" #include "cpu-timer.hh" #include "main.hh" #include "paper-def.hh" +#include "ly-modules.hh" -Score::Score() - : Input() -{ - header_p_ = 0; - music_p_ = 0; - errorlevel_i_ = 0; -} -Score::Score (Score const &s) - : Input (s) +/* + TODO: junkme. + */ +Score::Score () + : Input () { - music_p_ = (s.music_p_) ? s.music_p_->clone() : 0; - for (int i=0; i < s.def_p_arr_.size (); i++) - def_p_arr_.push(s.def_p_arr_[i]->clone()); + header_ = SCM_EOL; + music_ = SCM_EOL; - header_p_ = (s.header_p_) ? new Header (*s.header_p_): 0; + smobify_self (); } -Score::~Score() +Score::~Score () { - delete header_p_; - for (int i=0; i < def_p_arr_.size (); i++) - delete def_p_arr_[i]; - delete music_p_; + } -void -Score::run_translator (Music_output_def *odef_l) -{ - Cpu_timer timer; - Global_translator * trans_p = odef_l->get_global_translator_p(); - if (!trans_p) - return ; - *mlog << _("\nInterpreting music ..."); - trans_p->last_mom_ = music_p_->time_int().max (); - Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_, - trans_p); - iter->construct_children(); - if (! iter->ok()) - { - delete iter; - warning (_("Need music in a score")); - errorlevel_i_ =1; - return ; - } +IMPLEMENT_SMOBS (Score); +IMPLEMENT_DEFAULT_EQUAL_P (Score); - trans_p->start(); - while (iter->ok() || trans_p->moments_left_i ()) - { - Moment w = infinity_mom; - if (iter->ok()) - { - w = iter->next_moment(); - DOUT << "proccing: " << w <<"\n"; - if (!monitor->silent_b ("walking")) - iter->print(); - } - - trans_p->modify_next (w); - trans_p->prepare (w); - if (!monitor->silent_b ("walking")) - trans_p->print(); - - iter->process_and_next (w); - trans_p->process(); - } - delete iter; - trans_p->finish(); +SCM +Score::mark_smob (SCM s) +{ + Score * sc = (Score*) SCM_CELL_WORD_1 (s); + + if (sc->header_) + scm_gc_mark (sc->header_); + for (int i = sc->defs_.size (); i--;) + scm_gc_mark (sc->defs_[i]->self_scm ()); + + return sc->music_; +} +int +Score::print_smob (SCM , SCM p, scm_print_state*) +{ + scm_puts ("#", p); - if (errorlevel_i_) - { - // should we? hampers debugging. - warning (_("Errors found, /*not processing score*/")); - } + return 1; +} - Music_output * output = trans_p->get_output_p(); - delete trans_p; - *mlog << _(" (time: ") << String(timer.read (), "%.2f") << _(" seconds)"); - output->header_l_ = header_p_; - output->origin_str_ = location_str(); +/* + store point & click locations. + Global to save some time. (Sue us!) + */ - *mlog << endl; - output->process(); - delete output ; +Score::Score (Score const &s) + : Input (s) +{ + music_ = SCM_EOL; + header_ = 0; + smobify_self (); + + Music * m =unsmob_music (s.music_); + music_ = m?m->clone ()->self_scm () : SCM_EOL; + scm_gc_unprotect_object (music_); + + for (int i=0; i < s.defs_.size (); i++) + defs_.push (s.defs_[i]->clone ()); + + header_ = ly_make_anonymous_module (); + if (ly_module_p (s.header_)) + ly_copy_module_variables (header_, s.header_); } -void -Score::process() + + +LY_DEFINE(ly_run_translator, "ly:run-translator", + 2, 0, 0, + (SCM mus, SCM output_def), + "Process @var{mus} according to @var{output_def}. A interpretation " +"context is set up, and @var{mus} is interpreted with it. The " +"context is returned in its final state." ) { - if (!music_p_) - return; + Music_output_def *odef = unsmob_music_output_def (output_def); + Music * music = unsmob_music (mus); - print(); - for (int i=0; i < def_p_arr_.size (); i++) + SCM_ASSERT_TYPE (music, mus, SCM_ARG1, __FUNCTION__, "Music"); + SCM_ASSERT_TYPE (odef, output_def, SCM_ARG2, __FUNCTION__, "Output definition"); + + Cpu_timer timer; + Global_translator * trans = odef->get_global_translator (); + if (!trans) { - if (no_paper_global_b - && def_p_arr_[i]->is_type_b (Paper_def::static_name ())) - continue; - run_translator (def_p_arr_[i]); + programming_error ("no toplevel translator"); + return SCM_BOOL_F; } -} + progress_indication (_ ("Interpreting music...")); + + trans->final_mom_ = music->get_length (); + SCM protected_iter = Music_iterator::get_static_get_iterator (music); + Music_iterator * iter = unsmob_iterator (protected_iter); + iter->init_translator (music, trans); + iter->construct_children (); + if (! iter->ok ()) + { + warning (_ ("Need music in a score")); + return SCM_BOOL_F; // todo: shoudl throw exception. + } -void -Score::print() const + trans->start (); + trans->run_iterator_on_me (iter); + iter->quit(); + scm_remember_upto_here_1 (protected_iter); + trans->finish (); + + if (verbose_global_b) + progress_indication (_f ("elapsed time: %.2f seconds", timer.read ())); + + + return scm_gc_unprotect_object (trans->self_scm ()); +} + + +LY_DEFINE(ly_render_output, "ly:render-output", + 3,0,0, + (SCM context, SCM header, SCM out_filename), + "Given a Score context in its final state, calculate the output, " + "and dump the result to @var{out-filename}, using " + "@var{header} for the bibliographic information.") { -#ifndef NPRINT - DOUT << "score {\n"; - music_p_ -> print (); - for (int i=0; i < def_p_arr_.size (); i++) - def_p_arr_[i]->print(); - DOUT << "}\n"; -#endif + Translator *tr = unsmob_translator (context); + Global_translator * gt = dynamic_cast (tr); + + SCM_ASSERT_TYPE(gt, context, SCM_ARG1, __FUNCTION__, + "Score context"); + SCM_ASSERT_TYPE(ly_module_p(header), header, SCM_ARG2, __FUNCTION__, + "module"); + SCM_ASSERT_TYPE(gh_string_p (out_filename), out_filename, SCM_ARG3, __FUNCTION__, + "output filename"); + + Music_output * output = gt->get_output (); + + output->header_ = header; + + progress_indication ("\n"); + output->process (ly_scm2string (out_filename)); + + delete output ; + + return SCM_UNDEFINED ; } void -Score::add (Music_output_def *pap_p) +default_rendering (SCM mus, SCM outdef, SCM head, SCM outname) { - def_p_arr_.push(pap_p); + SCM context = ly_run_translator (mus, outdef); + + if (unsmob_translator (context)) + ly_render_output (context, head, outname); }