]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-position-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[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*> note_columns_;
26
27 protected:
28   DECLARE_ACKNOWLEDGER (note_column);
29   DECLARE_ACKNOWLEDGER (bass_figure_alignment);
30   DECLARE_END_ACKNOWLEDGER (bass_figure_alignment);
31
32   virtual void finalize ();
33   void start_spanner ();
34   void stop_spanner ();
35   void stop_translation_timestep ();
36 };
37
38 Figured_bass_position_engraver::Figured_bass_position_engraver ()
39 {
40   positioner_ = 0;
41   bass_figure_alignment_ = 0;
42 }
43
44 void
45 Figured_bass_position_engraver::start_spanner ()
46 {
47   assert (!positioner_);
48
49   positioner_ = make_spanner("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ());
50   positioner_->set_bound (LEFT, bass_figure_alignment_->get_bound (LEFT));
51   Axis_group_interface::add_element (positioner_, bass_figure_alignment_);
52 }
53
54 void
55 Figured_bass_position_engraver::stop_spanner ()
56 {
57   if (positioner_ && !positioner_->get_bound (RIGHT))
58     {
59       positioner_->set_bound (RIGHT, bass_figure_alignment_->get_bound (RIGHT));
60     }
61   
62   positioner_ = 0;
63   bass_figure_alignment_ = 0;
64 }
65
66 void
67 Figured_bass_position_engraver::finalize () 
68 {
69   stop_spanner ();
70 }
71
72 void
73 Figured_bass_position_engraver::acknowledge_note_column (Grob_info info)
74 {
75   note_columns_.push_back (info.grob ());
76 }
77
78 void
79 Figured_bass_position_engraver::stop_translation_timestep ()
80 {
81   if (positioner_)
82     {
83       for (vsize i = 0; i < note_columns_.size (); i++)
84         Side_position_interface::add_support (positioner_, note_columns_[i]);
85     }
86
87   note_columns_.clear ();
88 }
89
90 void
91 Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info info)
92 {
93   (void)info;
94   stop_spanner ();
95 }
96
97 void
98 Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info info)
99 {
100   bass_figure_alignment_ = dynamic_cast<Spanner*> (info.grob ());
101   start_spanner ();
102 }
103
104
105 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column);
106 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
107 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
108
109 ADD_TRANSLATOR (Figured_bass_position_engraver,
110                 /* doc */
111                 "Position figured bass alignments over notes.",
112                 
113                 /* create */
114                 "BassFigureAlignmentPositioning ",
115
116                 /* accept */ "",
117
118                 /* read */
119                 " ",
120                 /* write */ "");