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