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