X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver.cc;h=e2fbe860c092a44cf2e2b0f40a9174c4c2027711;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=8e49280fd8f928413eb810b4b1428da66e806691;hpb=55ac733b69643a6bc6a83b706c65cb56efd388ef;p=lilypond.git diff --git a/lily/engraver.cc b/lily/engraver.cc index 8e49280fd8..e2fbe860c0 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include "engraver.hh" #include "context.hh" +#include "grob-properties.hh" #include "international.hh" #include "music.hh" #include "paper-column.hh" @@ -43,31 +44,34 @@ Engraver::announce_grob (Grob_info inf) void Engraver::announce_end_grob (Grob_info inf) { + inf.start_end_ = STOP; get_daddy_engraver ()->announce_grob (inf); } -/* - CAUSE is the object (typically a Stream_event object) that - was the reason for making E. -*/ -void -Engraver::announce_grob (Grob *e, SCM cause) +Grob_info +Engraver::make_grob_info (Grob *e, SCM cause) { /* TODO: Remove Music code when it's no longer needed */ - if (Music *m = unsmob_music (cause)) + if (Music *m = Music::unsmob (cause)) { cause = m->to_event ()->unprotect (); } - if (unsmob_stream_event (cause) || unsmob_grob (cause)) + if (e->get_property ("cause") == SCM_EOL + && (Stream_event::is_smob (cause) || Grob::is_smob (cause))) e->set_property ("cause", cause); - Grob_info i (this, e); - - Engraver_group *g = get_daddy_engraver (); - if (g) - g->announce_grob (i); + return Grob_info (this, e); } +/* + CAUSE is the object (typically a Stream_event object) that + was the reason for making E. +*/ +void +Engraver::announce_grob (Grob *e, SCM cause) +{ + announce_grob (make_grob_info (e, cause)); +} /* CAUSE is the object (typically a grob or stream-event object) that @@ -75,24 +79,9 @@ Engraver::announce_grob (Grob *e, SCM cause) void Engraver::announce_end_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 (e->get_property ("cause") == SCM_EOL - && (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); + announce_end_grob (make_grob_info (e, cause)); } - Engraver::Engraver () { } @@ -100,12 +89,12 @@ Engraver::Engraver () #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.") + 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.") { LY_ASSERT_TYPE (ly_is_procedure, cb, 1); @@ -117,11 +106,11 @@ LY_DEFINE (ly_set_grob_creation_callback, "ly:set-grob-creation-callback", Grob * Engraver::internal_make_grob (SCM symbol, - SCM cause, - char const * /* name */, - char const *file, - int line, - char const *fun) + SCM cause, + char const * /* name */, + char const *file, + int line, + char const *fun) { #ifdef NDEBUG (void)file; @@ -129,7 +118,7 @@ Engraver::internal_make_grob (SCM symbol, (void)fun; #endif - SCM props = updated_grob_properties (context (), symbol); + SCM props = Grob_property_info (context (), symbol).updated (); Grob *grob = 0; @@ -149,8 +138,8 @@ Engraver::internal_make_grob (SCM symbol, #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)); + 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; @@ -158,8 +147,8 @@ Engraver::internal_make_grob (SCM symbol, Item * Engraver::internal_make_item (SCM x, SCM cause, - char const *name, - char const *file, int line, char const *fun) + char const *name, + char const *file, int line, char const *fun) { Item *it = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); assert (it); @@ -168,46 +157,39 @@ Engraver::internal_make_item (SCM x, SCM cause, Paper_column * Engraver::internal_make_column (SCM x, char const *name, - char const *file, int line, char const *fun) + char const *file, int line, char const *fun) { return dynamic_cast (internal_make_grob (x, SCM_EOL, name, file, line, fun)); } Spanner * Engraver::internal_make_spanner (SCM x, SCM cause, char const *name, - char const *file, int line, char const *fun) + char const *file, int line, char const *fun) { Spanner *sp = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); assert (sp); return sp; } -Engraver* -unsmob_engraver (SCM eng) -{ - return dynamic_cast (unsmob_translator (eng)); -} - bool ly_is_grob_cause (SCM obj) { - return unsmob_grob (obj) || unsmob_stream_event (obj) || (obj == SCM_EOL); + return Grob::is_smob (obj) || Stream_event::is_smob (obj) || (obj == SCM_EOL); } #include "translator.icc" ADD_TRANSLATOR (Engraver, - /* doc */ - "Base class for engravers. Does nothing, so it is not used.", - - /* create */ - "", + /* doc */ + "Base class for engravers. Does nothing, so it is not used.", - /* read */ - "", + /* create */ + "", - /* write */ - "" - ); + /* read */ + "", + /* write */ + "" + );