(readPostTable): ugh. Kludge: nglyphs in maxp
[lilypond.git] / lily / fingering-engraver.cc
blob00e468a7816d0b6c529e0813effbe2ab643f771b
1 /*
2 fingering-engraver.cc -- implement Fingering_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
9 #include "engraver.hh"
10 #include "side-position-interface.hh"
11 #include "stem.hh"
12 #include "rhythmic-head.hh"
13 #include "self-alignment-interface.hh"
15 class Fingering_engraver : public Engraver
17 Link_array<Music> reqs_;
18 Link_array<Item> fingerings_;
20 public:
21 TRANSLATOR_DECLARATIONS (Fingering_engraver);
22 protected:
23 virtual bool try_music (Music *m);
24 virtual void stop_translation_timestep ();
25 virtual void start_translation_timestep ();
26 virtual void process_music ();
27 virtual void acknowledge_grob (Grob_info);
29 private:
30 void make_script (Direction, Music *, int);
33 bool
34 Fingering_engraver::try_music (Music *m)
36 if (m->is_mus_type ("fingering-event"))
38 reqs_.push (m);
39 return true;
41 return false;
44 void
45 Fingering_engraver::acknowledge_grob (Grob_info inf)
47 if (Stem::has_interface (inf.grob ()))
49 for (int i = 0; i < fingerings_.size (); i++)
51 Side_position_interface::add_support (fingerings_[i], inf.grob ());
54 else if (Rhythmic_head::has_interface (inf.grob ()))
56 for (int i = 0; i < fingerings_.size (); i++)
58 Grob *t = fingerings_[i];
59 Side_position_interface::add_support (t, inf.grob ());
60 if (!t->get_parent (X_AXIS))
61 t->set_parent (inf.grob (), X_AXIS);
66 void
67 Fingering_engraver::process_music ()
69 for (int i = reqs_.size (); i--;)
71 SCM dir = reqs_[i]->get_property ("direction");
72 make_script (to_dir (dir), reqs_[i], i);
76 void
77 Fingering_engraver::make_script (Direction d, Music *r, int i)
79 Item *fingering = make_item ("Fingering", r->self_scm ());
80 Axis a = Y_AXIS;
81 Axis other = other_axis (a);
84 Huh, what's this for? --hwn.
86 junkme.
88 SCM pitch = r->get_property ("pitch");
89 if (unsmob_pitch (pitch))
90 fingering->set_property ("pitch", pitch);
93 We can't fold these definitions into define-grobs since
94 fingerings for chords need different settings.
96 Side_position_interface::set_axis (fingering, a);
97 fingering->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, other);
98 fingering->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, other);
100 // Hmm
101 int priority = 200;
102 SCM s = fingering->get_property ("script-priority");
103 if (scm_is_number (s))
104 priority = scm_to_int (s);
106 /* See script-engraver.cc */
107 priority += i;
109 fingering->set_property ("script-priority", scm_int2num (priority));
111 if (!is_direction (fingering->get_property ("direction")))
113 if (d)
114 fingering->set_property ("direction", scm_int2num (d));
115 else
116 fingering->set_property ("direction", scm_int2num (RIGHT));
119 SCM dig = r->get_property ("digit");
120 fingering->set_property ("text", scm_number_to_string (dig, scm_int2num (10)));
122 fingerings_.push (fingering);
125 void
126 Fingering_engraver::stop_translation_timestep ()
128 if (!fingerings_.size ())
129 return;
131 fingerings_.clear ();
134 void
135 Fingering_engraver::start_translation_timestep ()
137 reqs_.clear ();
140 Fingering_engraver::Fingering_engraver ()
144 ADD_TRANSLATOR (Fingering_engraver,
145 /* descr */ "Create fingering-scripts",
146 /* creats*/ "Fingering",
147 /* accepts */ "fingering-event",
148 /* acks */ "rhythmic-head-interface stem-interface",
149 /* reads */ "",
150 /* write */ "");