]> git.donarmstrong.com Git - lilypond.git/blob - lily/hara-kiri-engraver.cc
(Invoking lilypond-book):
[lilypond.git] / lily / hara-kiri-engraver.cc
1 /*
2   hara-kiri-engraver.cc --  implement Hara_kiri_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "axis-group-engraver.hh"
10 #include "hara-kiri-group-spanner.hh"
11 #include "rhythmic-head.hh"
12 #include "spanner.hh"
13
14 #include "translator.icc"
15
16 /*
17   TODO: fold together with axis_group_engraver? 
18  */
19
20 class Hara_kiri_engraver : public Axis_group_engraver
21 {
22 protected:
23   virtual Spanner *get_spanner ();
24   DECLARE_ACKNOWLEDGER (grob);
25   virtual void add_element (Grob *e);
26   void start_translation_timestep ();
27   virtual void derived_mark () const;
28   SCM interesting_;
29 public:
30   TRANSLATOR_DECLARATIONS (Hara_kiri_engraver);
31 };
32
33
34 Hara_kiri_engraver::Hara_kiri_engraver ()
35 {
36   interesting_ = SCM_EOL;
37 }
38
39 void
40 Hara_kiri_engraver::derived_mark () const
41 {
42   scm_gc_mark (interesting_);
43 }
44
45 void
46 Hara_kiri_engraver::start_translation_timestep ()
47 {
48   Axis_group_engraver::start_translation_timestep ();
49   interesting_ = get_property ("keepAliveInterfaces");
50 }
51
52 void
53 Hara_kiri_engraver::add_element (Grob *e)
54 {
55   Axis_group_engraver::add_element (e);
56 }
57
58 Spanner *
59 Hara_kiri_engraver::get_spanner ()
60 {
61   Spanner *sp = make_spanner ("VerticalAxisGroup", SCM_EOL);
62   return sp;
63 }
64
65 void
66 Hara_kiri_engraver::acknowledge_grob (Grob_info i)
67 {
68   Axis_group_engraver::acknowledge_grob (i);
69   if (staffline_)
70     {
71       for (SCM s = interesting_; scm_is_pair (s); s = scm_cdr (s))
72         {
73           if (i.grob ()->internal_has_interface (scm_car (s)))
74             Hara_kiri_group_spanner::add_interesting_item (staffline_, i.grob ());
75         }
76     }
77 }
78
79
80 ADD_ACKNOWLEDGER (Hara_kiri_engraver, grob);
81 ADD_TRANSLATOR (Hara_kiri_engraver,
82                 /* doc */ "Like Axis_group_engraver, but make a hara-kiri spanner, and add "
83                 "interesting items (ie. note heads, lyric syllables and normal rests) ",
84                 /* create */ "VerticalAxisGroup",
85                 /* accept */ "",
86                 /* read */ "keepAliveInterfaces",
87                 /* write */ "");
88