X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore.cc;h=d8887be29f72d0c1a78cef1bc488dedf4a37eebb;hb=7cb049f7f3705e414c2a49c7cf14f43a51914c48;hp=8f97c31d76d60b195798ed88bd02a497cfa2a158;hpb=c844072722a39a5fcd20372b0497d9130bd41dd7;p=lilypond.git diff --git a/lily/score.cc b/lily/score.cc index 8f97c31d76..d8887be29f 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -3,131 +3,156 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ +#include "ly-smobs.icc" + #include "score.hh" #include "debug.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" -Score::Score() - : Input() +/* + TODO: junkme. + */ + +Score::Score () + : Input () { header_p_ = 0; - music_p_ = 0; + music_ = SCM_EOL; errorlevel_i_ = 0; + + smobify_self (); } +/* + store point & click locations. + Global to save some time. (Sue us!) + */ +bool store_locations_global_b; + Score::Score (Score const &s) : Input (s) { - music_p_ = (s.music_p_) ? s.music_p_->clone() : 0; + music_ = SCM_EOL; + header_p_ = 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.def_p_arr_.size (); i++) - def_p_arr_.push(s.def_p_arr_[i]->clone()); + def_p_arr_.push (s.def_p_arr_[i]->clone ()); + errorlevel_i_ = s.errorlevel_i_; + if (s.header_p_) + { + header_p_ = (s.header_p_) ? new Scheme_hash_table (*s.header_p_): 0; - header_p_ = (s.header_p_) ? new Header (*s.header_p_): 0; + scm_gc_unprotect_object (header_p_->self_scm ()); + } } -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) { + /* + We want to know if we want to store locations, since they take a + lot of overhead. + + */ + store_locations_global_b = (gh_eval_str ("point-and-click") != SCM_BOOL_F); + + Cpu_timer timer; - Global_translator * trans_p = odef_l->get_global_translator_p(); + + + Global_translator * trans_p = odef_l->get_global_translator_p (); if (!trans_p) { - non_fatal_error ("No toplevel translator."); + programming_error ("no toplevel translator"); return ; } - *mlog << _("\nInterpreting music ..."); - trans_p->last_mom_ = music_p_->time_int().max (); + progress_indication (_ ("Interpreting music...")); + Music * music = unsmob_music (music_); + + trans_p->final_mom_ = music->length_mom (); - Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_, - trans_p); - iter->construct_children(); - if (! iter->ok()) + Music_iterator * iter = Music_iterator::static_get_iterator_p (music); + iter->init_translator (music, trans_p); + + iter->construct_children (); + + if (! iter->ok ()) { delete iter; - warning (_("Need music in a score")); + warning (_ ("Need music in a score")); errorlevel_i_ =1; return ; } - trans_p->start(); - - while (iter->ok() || trans_p->moments_left_i ()) - { - Moment w; - w.set_infinite (1); - 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(); - } + trans_p->start (); + trans_p->run_iterator_on_me (iter); delete iter; - trans_p->finish(); - + trans_p->finish (); if (errorlevel_i_) { // should we? hampers debugging. - warning (_("Errors found, /*not processing score*/")); + warning (_ ("Errors found/*, not processing score*/")); } - Music_output * output = trans_p->get_output_p(); - delete trans_p; - *mlog << _(" (time: ") << String(timer.read (), "%.2f") << _(" seconds)"); + Music_output * output = trans_p->get_output_p (); + scm_gc_unprotect_object (trans_p->self_scm ()); + + if (verbose_global_b) + progress_indication (_f ("elapsed time: %.2f seconds", timer.read ())); + if (!header_p_) + header_p_ = new Scheme_hash_table; // ugh output->header_l_ = header_p_; - output->origin_str_ = location_str(); + output->origin_str_ = location_str (); - *mlog << endl; - output->process(); + progress_indication ("\n"); + output->process (); delete output ; + + /* + force GC. At this point, GUILE may give back mallocated area to + the system. + */ + + scm_gc (); } void -Score::process() +Score::process () { - if (!music_p_) + if (!unsmob_music (music_)) return; - print(); + for (int i=0; i < def_p_arr_.size (); i++) { if (no_paper_global_b - && def_p_arr_[i]->is_type_b (Paper_def::static_name ())) + && dynamic_cast (def_p_arr_[i])) continue; run_translator (def_p_arr_[i]); } @@ -135,20 +160,33 @@ Score::process() + void -Score::print() const +Score::add_output (Music_output_def *pap_p) { -#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 + def_p_arr_.push (pap_p); } -void -Score::add (Music_output_def *pap_p) +IMPLEMENT_SMOBS (Score); +IMPLEMENT_DEFAULT_EQUAL_P (Score); + + +SCM +Score::mark_smob (SCM s) { - def_p_arr_.push(pap_p); + Score * sc = (Score*) SCM_CELL_WORD_1 (s); + if (sc->header_p_) + scm_gc_mark (sc->header_p_->self_scm ()); + for (int i = sc->def_p_arr_.size (); i--;) + scm_gc_mark (sc->def_p_arr_[i]->self_scm ()); + + return sc->music_; +} + +int +Score::print_smob (SCM , SCM p, scm_print_state*) +{ + scm_puts ("#", p); + + return 1; }