]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-position-engraver.cc
* lily/translator.cc, lily/context.cc:, lily/translator-group.cc:
[lilypond.git] / lily / figured-bass-position-engraver.cc
1 /*
2   figured-bass-position-engraver.cc -- implement Figured_bass_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
10 #include "engraver.hh"
11
12 #include "context.hh"
13 #include "spanner.hh"
14 #include "side-position-interface.hh"
15 #include "translator.icc"
16 #include "axis-group-interface.hh"
17
18 class Figured_bass_position_engraver : public Engraver
19 {
20   TRANSLATOR_DECLARATIONS(Figured_bass_position_engraver);
21
22   Spanner *bass_figure_alignment_;
23   Spanner *positioner_;
24   vector<Grob*> support_;
25   vector<Grob*> span_support_;
26 protected:
27   DECLARE_ACKNOWLEDGER (note_column);
28   DECLARE_ACKNOWLEDGER (slur);
29   DECLARE_END_ACKNOWLEDGER (slur);
30   DECLARE_ACKNOWLEDGER (tie);
31   DECLARE_ACKNOWLEDGER (bass_figure_alignment);
32   DECLARE_END_ACKNOWLEDGER (bass_figure_alignment);
33
34   virtual void finalize ();
35   void start_spanner ();
36   void stop_spanner ();
37   void stop_translation_timestep ();
38 };
39
40 Figured_bass_position_engraver::Figured_bass_position_engraver ()
41 {
42   positioner_ = 0;
43   bass_figure_alignment_ = 0;
44 }
45
46 void
47 Figured_bass_position_engraver::start_spanner ()
48 {
49   assert (!positioner_);
50
51   positioner_ = make_spanner("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ());
52   positioner_->set_bound (LEFT, bass_figure_alignment_->get_bound (LEFT));
53   Axis_group_interface::add_element (positioner_, bass_figure_alignment_);
54 }
55
56 void
57 Figured_bass_position_engraver::stop_spanner ()
58 {
59   if (positioner_ && !positioner_->get_bound (RIGHT))
60     {
61       positioner_->set_bound (RIGHT, bass_figure_alignment_->get_bound (RIGHT));
62     }
63   
64   positioner_ = 0;
65   bass_figure_alignment_ = 0;
66 }
67
68 void
69 Figured_bass_position_engraver::finalize () 
70 {
71   stop_spanner ();
72 }
73
74 void
75 Figured_bass_position_engraver::acknowledge_note_column (Grob_info info)
76 {
77   support_.push_back (info.grob ());
78 }
79
80 void
81 Figured_bass_position_engraver::acknowledge_end_slur (Grob_info info)
82 {
83   vector<Grob*>::iterator i = find (span_support_.begin (), span_support_.end (),
84                                     info.grob ());
85
86   if (i < span_support_.end ())
87     span_support_.erase (i);
88 }
89
90 void
91 Figured_bass_position_engraver::acknowledge_slur (Grob_info info)
92 {
93   span_support_.push_back (info.grob ());
94 }
95
96 void
97 Figured_bass_position_engraver::acknowledge_tie (Grob_info info)
98 {
99   support_.push_back (info.grob ());
100 }
101
102 void
103 Figured_bass_position_engraver::stop_translation_timestep ()
104 {
105   if (positioner_)
106     {
107       for (vsize i = 0; i < span_support_.size (); i++)
108         Side_position_interface::add_support (positioner_, span_support_[i]);
109       for (vsize i = 0; i < support_.size (); i++)
110         Side_position_interface::add_support (positioner_, support_[i]);
111     }
112
113   support_.clear ();
114 }
115
116 void
117 Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info info)
118 {
119   (void)info;
120   stop_spanner ();
121 }
122
123 void
124 Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info info)
125 {
126   bass_figure_alignment_ = dynamic_cast<Spanner*> (info.grob ());
127   start_spanner ();
128 }
129
130
131 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column);
132 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
133 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
134
135 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,tie);
136 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
137 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
138
139 ADD_TRANSLATOR (Figured_bass_position_engraver,
140                 /* doc */
141                 "Position figured bass alignments over notes.",
142                 
143                 /* create */
144                 "BassFigureAlignmentPositioning ",
145
146                 /* accept */ "",
147
148                 /* read */
149                 " ",
150                 /* write */ "");