X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver.cc;h=84780dd0a2fc489997560a472ab67db2bb18fab3;hb=3ad6bd596eca2fd81f0301e136b4b6a651e1fa3d;hp=4dea919ecaedf486bfb7156f74c7a25182c45aa7;hpb=48bdd9154a32245a075494b403639181615864e2;p=lilypond.git diff --git a/lily/engraver.cc b/lily/engraver.cc index 4dea919eca..84780dd0a2 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -1,135 +1,174 @@ /* engraver.cc -- implement Engraver - Sourcefile of GNU LilyPond musictypesetter + Sourcefile of GNU LilyPond music type setter - (c) 1997 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ -#include "music-list.hh" -#include "musical-request.hh" #include "engraver.hh" -#include "engraver-group.hh" -#include "debug.hh" -void -Engraver::post_move_processing() -{ - if (status < CREATION_INITED) { - do_creation_processing(); - status = CREATION_INITED; - } - if (status >= MOVE_INITED) - return; - - do_post_move_processing(); - status = MOVE_INITED; -} +#include "context.hh" +#include "international.hh" +#include "music.hh" +#include "paper-column.hh" +#include "score-engraver.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "warn.hh" -bool -Engraver::try_request(Request * r) +Engraver_group * +Engraver::get_daddy_engraver () const { - if (status < MOVE_INITED) - post_move_processing(); - - return do_try_request(r); + return dynamic_cast (get_daddy_translator ()); } void -Engraver::process_requests() +Engraver::announce_grob (Grob_info inf) { - if (status < PROCESSED_REQS) - post_move_processing(); - else if (status >= PROCESSED_REQS) - return; - - status = PROCESSED_REQS; - do_process_requests(); + get_daddy_engraver ()->announce_grob (inf); } void -Engraver::pre_move_processing() +Engraver::announce_end_grob (Grob_info inf) { - do_pre_move_processing(); - status = CREATION_INITED; + get_daddy_engraver ()->announce_grob (inf); } +/* + CAUSE is the object (typically a Stream_event object) that + was the reason for making E. +*/ void -Engraver::fill_staff_info(Staff_info&) +Engraver::announce_grob (Grob *e, SCM cause) { - -} + /* TODO: Remove Music code when it's no longer needed */ + if (Music *m = unsmob_music (cause)) + { + cause = m->to_event ()->unprotect (); + } + if (unsmob_stream_event (cause) || unsmob_grob (cause)) + e->set_property ("cause", cause); -Scalar -Engraver::get_feature(String t) -{ - return daddy_grav_l_->get_feature(t); -} + Grob_info i (this, e); -bool -Engraver::do_try_request(Request*) -{ - return false; + Engraver_group *g = get_daddy_engraver (); + if (g) + g->announce_grob (i); } -Engraver::Engraver() -{ - status = VIRGIN; - daddy_grav_l_ = 0; -} +/* + CAUSE is the object (typically a Music object) that + was the reason for making E. +*/ void -Engraver::announce_element(Score_elem_info i) +Engraver::announce_end_grob (Grob *e, SCM cause) { - i.origin_grav_l_arr_.push(this); - daddy_grav_l_->announce_element(i); + /* TODO: Remove Music code when it's no longer needed */ + if (Music *m = unsmob_music (cause)) + { + cause = m->to_event ()->unprotect (); + } + if (unsmob_stream_event (cause) || unsmob_grob (cause)) + e->set_property ("cause", cause); + + Grob_info i (this, e); + + i.start_end_ = STOP; + Engraver_group *g = get_daddy_engraver (); + if (g) + g->announce_grob (i); } -void -Engraver::typeset_element(Score_elem*p) + +Engraver::Engraver () { - daddy_grav_l_->typeset_element(p); } -Paper_def* -Engraver::paper()const +#ifndef NDEBUG +static SCM creation_callback = SCM_EOL; +LY_DEFINE (ly_set_grob_creation_callback, "ly:set-grob-creation-callback", + 1, 0, 0, (SCM cb), + "Specify a procedure that will be called every time a new grob " + "is created. The callback will receive as arguments the grob " + "that was created, the name of the C++ source file that caused " + "the grob to be created and the corresponding line number in the " + "C++ source file.") { - return daddy_grav_l_->paper(); + LY_ASSERT_TYPE (ly_is_procedure, cb, 1); + + creation_callback = cb; + + return SCM_UNSPECIFIED; } +#endif -void -Engraver::typeset_breakable_item(Item * nobreak_p) +Grob * +Engraver::internal_make_grob (SCM symbol, SCM cause, char const *name, char const *file, int line, char const *fun) { - daddy_grav_l_->typeset_breakable_item(nobreak_p); + (void) file; + (void) fun; + (void) line; + (void) name; + + SCM props = updated_grob_properties (context (), symbol); + + Grob *grob = 0; + + SCM handle = scm_sloppy_assq (ly_symbol2scm ("meta"), props); + SCM klass = scm_cdr (scm_sloppy_assq (ly_symbol2scm ("class"), scm_cdr (handle))); + + if (klass == ly_symbol2scm ("Item")) + grob = new Item (props); + else if (klass == ly_symbol2scm ("Spanner")) + grob = new Spanner (props); + else if (klass == ly_symbol2scm ("Paper_column")) + grob = new Paper_column (props); + + assert (grob); + announce_grob (grob, cause); + +#ifndef NDEBUG + if (ly_is_procedure (creation_callback)) + scm_apply_0 (creation_callback, + scm_list_n (grob->self_scm (), scm_from_locale_string (file), + scm_from_int (line), scm_from_locale_string (fun), SCM_UNDEFINED)); +#endif + + return grob; } -bool -Engraver::contains_b(Engraver *grav_l)const +Item * +Engraver::internal_make_item (SCM x, SCM cause, + char const *name, + char const *file, int line, char const *fun) { - return this == grav_l; + Item *it = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); + assert (it); + return it; } -Staff_info -Engraver::get_staff_info() const +Paper_column * +Engraver::internal_make_column (SCM x, char const *name, + char const *file, int line, char const *fun) { - return daddy_grav_l_->get_staff_info(); + return dynamic_cast (internal_make_grob (x, SCM_EOL, name, file, line, fun)); } -void -Engraver::print() const +Spanner * +Engraver::internal_make_spanner (SCM x, SCM cause, char const *name, char const *file, int line, char const *fun) { -#ifndef NPRINT - mtor << "\n" << name() << " {"; - do_print(); - mtor << "}"; -#endif + Spanner *sp = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); + assert (sp); + return sp; } +#include "translator.icc" -IMPLEMENT_IS_TYPE_B(Engraver); - -void -Engraver::do_print() const -{ -} +ADD_TRANSLATOR (Engraver, + "Base class for engravers. Does nothing, so it is not used.", + "", + "", + "");