]> git.donarmstrong.com Git - lilypond.git/blob - lily/grace-engraver.cc
*** empty log message ***
[lilypond.git] / lily / grace-engraver.cc
1 /*
2   grace-engraver.cc -- implement Grace_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "engraver.hh"
10 #include "context.hh"
11 #include "warn.hh"
12
13 class Grace_engraver : public Engraver
14 {
15 protected:
16   virtual void start_translation_timestep ();
17   virtual void derived_mark () const;
18
19   TRANSLATOR_DECLARATIONS (Grace_engraver);
20   Moment last_moment_;
21   SCM grace_settings_;
22 public:
23 };
24
25 Grace_engraver::Grace_engraver ()
26 {
27   grace_settings_ = SCM_EOL;
28 }
29
30 void
31 Grace_engraver::derived_mark () const
32 {
33   scm_gc_mark (grace_settings_);
34   Engraver::derived_mark ();
35 }
36
37 void
38 Grace_engraver::start_translation_timestep ()
39 {
40   Moment now = now_mom ();
41   if (last_moment_.grace_part_ && !now.grace_part_)
42     {
43       for (SCM s = grace_settings_; scm_is_pair (s); s = scm_cdr (s))
44         {
45           SCM context = scm_caar (s);
46           SCM entry = scm_cdar (s);
47           SCM grob = scm_cadr (entry);
48           SCM sym = scm_caddr (entry);
49
50           execute_pushpop_property (unsmob_context (context),
51                                     grob, sym, SCM_UNDEFINED);
52         }
53
54       grace_settings_ = SCM_EOL;
55     }
56   else if (!last_moment_.grace_part_ && now.grace_part_)
57     {
58       SCM settings = get_property ("graceSettings");
59
60       grace_settings_ = SCM_EOL;
61       for (SCM s = settings; scm_is_pair (s); s = scm_cdr (s))
62         {
63           SCM entry = scm_car (s);
64           SCM context_name = scm_car (entry);
65           SCM grob = scm_cadr (entry);
66           SCM sym = scm_caddr (entry);
67           SCM val = scm_cadr (scm_cddr (entry));
68
69           Context *c = context ();
70           while (c
71                  && c->context_name_symbol () != context_name)
72             {
73               c = c->get_parent_context ();
74             }
75
76           if (c)
77             {
78               execute_pushpop_property (c,
79                                         grob, sym, val);
80               grace_settings_
81                 = scm_cons (scm_cons (c->self_scm (), entry), grace_settings_);
82             }
83           else
84             {
85               programming_error ("can't find context");
86               scm_display (context_name, scm_current_error_port ());
87             }
88         }
89     }
90
91   last_moment_ = now;
92 }
93
94 ADD_TRANSLATOR (Grace_engraver,
95                 /* descr */ "Set font size and other properties for grace notes.",
96                 /* creats*/ "",
97                 /* accepts */ "",
98                 /* acks  */ "",
99                 /* reads */ "graceSettings",
100                 /* write */ "");