2 custos-engraver.cc -- implement Custos_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2005 Juergen Reuter <reuter@ipd.uka.de>,
7 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "bar-line.hh"
13 #include "note-head.hh"
14 #include "staff-symbol-referencer.hh"
18 * This class implements an engraver for custos symbols.
20 * FIXME: note heads inside of ligatures (i.e. ligature heads) are
21 * sometimes not recognized by this engraver. --jr
23 class Custos_engraver
: public Engraver
26 TRANSLATOR_DECLARATIONS (Custos_engraver
);
27 virtual void start_translation_timestep ();
28 virtual void acknowledge_grob (Grob_info
);
29 virtual void process_acknowledged_grobs ();
30 virtual void stop_translation_timestep ();
31 virtual void finalize ();
34 Item
*create_custos ();
35 bool custos_permitted
;
36 Link_array
<Grob
> custodes_
;
37 Array
<Pitch
> pitches_
;
40 Custos_engraver::Custos_engraver ()
42 custos_permitted
= false;
46 Custos_engraver::stop_translation_timestep ()
49 delay typeset until we're at the next moment, so we can silence custodes at the end of the piece.
53 custos_permitted
= false;
57 Custos_engraver::start_translation_timestep ()
63 Custos_engraver::acknowledge_grob (Grob_info info
)
65 Item
*item
= dynamic_cast<Item
*> (info
.grob ());
68 Music
*m
= info
.music_cause ();
69 if (Bar_line::has_interface (info
.grob ()))
70 custos_permitted
= true;
71 else if (Note_head::has_interface (info
.grob ())
73 && m
->is_mus_type ("note-event"))
77 ideally, we'd do custos->set_parent (Y_AXIS, notehead),
78 but since the note head lives on the other system, we can't
80 So we copy the position from the note head pitch. We
81 don't look at the staff-position, since we can't be sure
82 whether Clef_engraver already applied a vertical shift.
84 pitches_
.push (*unsmob_pitch (m
->get_property ("pitch")));
90 Custos_engraver::process_acknowledged_grobs ()
92 if (scm_is_string (get_property ("whichBar")))
93 custos_permitted
= true;
97 for (int i
= pitches_
.size (); i
--;)
99 Item
*c
= create_custos ();
101 int p
= pitches_
[i
].steps ();
102 SCM c0
= get_property ("middleCPosition");
103 if (scm_is_number (c0
))
104 p
+= scm_to_int (c0
);
106 c
->set_property ("staff-position",
115 Custos_engraver::create_custos ()
117 Item
*custos
= make_item ("Custos", SCM_EOL
);
119 custodes_
.push (custos
);
125 Custos_engraver::finalize ()
127 for (int i
= custodes_
.size (); i
--;)
129 custodes_
[i
]->suicide ();
134 ADD_TRANSLATOR (Custos_engraver
,
136 /* creats*/ "Custos",
138 /* acks */ "bar-line-interface note-head-interface",