X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver.cc;fp=lily%2Fengraver.cc;h=12615eb8d6cbc780fc96a8e95cdee2fab6984bc8;hb=941dff9d2a67080e0dd8474f1e70f0c72ace6424;hp=7724b1c395a5c68ec5b19398ce08b8bedf2d0cb4;hpb=5a22d6233a39d3164e1ca043244794c268be4ad0;p=lilypond.git diff --git a/lily/engraver.cc b/lily/engraver.cc index 7724b1c395..12615eb8d6 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -1,9 +1,20 @@ /* - engraver.cc -- implement Engraver + This file is part of LilyPond, the GNU music typesetter. - Sourcefile of GNU LilyPond music type setter + Copyright (C) 1997--2011 Han-Wen Nienhuys - (c) 1997--2009 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "engraver.hh" @@ -32,54 +43,43 @@ 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)) { cause = m->to_event ()->unprotect (); } - if (unsmob_stream_event (cause) || unsmob_grob (cause)) + if (e->get_property ("cause") == SCM_EOL + && (unsmob_stream_event (cause) || unsmob_grob (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 Music object) that + CAUSE is the object (typically a Stream_event object) that was the reason for making E. */ void -Engraver::announce_end_grob (Grob *e, SCM cause) +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 (e->get_property ("cause") == SCM_EOL - && (unsmob_stream_event (cause) || unsmob_grob (cause))) - e->set_property ("cause", cause); + announce_grob (make_grob_info (e, cause)); +} - Grob_info i (this, e); - i.start_end_ = STOP; - Engraver_group *g = get_daddy_engraver (); - if (g) - g->announce_grob (i); +/* + CAUSE is the object (typically a grob or stream-event object) that + was the reason for ending E. */ +void +Engraver::announce_end_grob (Grob *e, SCM cause) +{ + announce_end_grob (make_grob_info (e, cause)); } @@ -164,13 +164,26 @@ Engraver::internal_make_column (SCM x, char const *name, } Spanner * -Engraver::internal_make_spanner (SCM x, SCM cause, char const *name, char const *file, int line, char const *fun) +Engraver::internal_make_spanner (SCM x, SCM cause, char const *name, + 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); +} + #include "translator.icc" ADD_TRANSLATOR (Engraver, @@ -187,3 +200,4 @@ ADD_TRANSLATOR (Engraver, "" ); +