X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrace-engraver.cc;h=5055b86807dbb445ea91417cbbc8b6ec14c783d0;hb=c9f2e5f23fd435ab69b4313a2e5902556cc91511;hp=352fc840fd57325acd08aed5f3a72e367ebae1b5;hpb=728e41a1741382885396935663e35f9dceaf1d49;p=lilypond.git diff --git a/lily/grace-engraver.cc b/lily/grace-engraver.cc index 352fc840fd..5055b86807 100644 --- a/lily/grace-engraver.cc +++ b/lily/grace-engraver.cc @@ -1,10 +1,20 @@ -/* - grace-engraver.cc -- implement Grace_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2004 Han-Wen Nienhuys - +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2004--2011 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" @@ -13,30 +23,32 @@ class Grace_engraver : public Engraver { + void consider_change_grace_settings (); protected: - virtual void start_translation_timestep (); - virtual void derived_mark (); - + void start_translation_timestep (); + virtual void derived_mark () const; + virtual void initialize (); + TRANSLATOR_DECLARATIONS (Grace_engraver); Moment last_moment_; SCM grace_settings_; public: }; - -Grace_engraver::Grace_engraver() +Grace_engraver::Grace_engraver () { grace_settings_ = SCM_EOL; + last_moment_ = Moment (Rational (-1, 1)); } void -Grace_engraver::derived_mark () +Grace_engraver::initialize () { - scm_gc_mark (grace_settings_); + consider_change_grace_settings (); } void -Grace_engraver::start_translation_timestep () +Grace_engraver::consider_change_grace_settings () { Moment now = now_mom (); if (last_moment_.grace_part_ && !now.grace_part_) @@ -65,38 +77,53 @@ Grace_engraver::start_translation_timestep () SCM context_name = scm_car (entry); SCM grob = scm_cadr (entry); SCM sym = scm_caddr (entry); - SCM val = scm_cadddr (entry); + SCM val = scm_cadr (scm_cddr (entry)); Context *c = context (); - while (c - && c->context_name_symbol () != context_name) - { - c = c->get_parent_context (); - } + while (c && !c->is_alias (context_name)) + c = c->get_parent_context (); - if (c) + if (c) { execute_pushpop_property (c, grob, sym, val); grace_settings_ - = scm_cons (scm_cons (c->self_scm(), entry), grace_settings_); + = scm_cons (scm_cons (c->self_scm (), entry), grace_settings_); } else - { - programming_error ("Cannot find context"); - scm_display (context_name, scm_current_error_port()); - } + programming_error ("cannot find context from graceSettings: " + + ly_symbol2string (context_name)); } } - last_moment_ = now; + last_moment_ = now_mom (); } +void +Grace_engraver::derived_mark () const +{ + scm_gc_mark (grace_settings_); + Engraver::derived_mark (); +} + +void +Grace_engraver::start_translation_timestep () +{ + consider_change_grace_settings (); +} + +#include "translator.icc" + +ADD_TRANSLATOR (Grace_engraver, + /* doc */ + "Set font size and other properties for grace notes.", + + /* create */ + "", + + /* read */ + "graceSettings ", -ENTER_DESCRIPTION (Grace_engraver, - /* descr */ "Set font size and other properties for grace notes.", - /* creats*/ "", - /* accepts */ "", - /* acks */ "", - /* reads */ "graceSettings", - /* write */ ""); + /* write */ + "" + );