]> git.donarmstrong.com Git - lilypond.git/blob - lily/ledger-line-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / ledger-line-engraver.cc
1 /*
2   ledger-line-engraver.cc -- implement Ledger_line_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "pointer-group-interface.hh"
10 #include "spanner.hh"
11 #include "engraver.hh"
12 #include "staff-symbol.hh"
13
14 class Ledger_line_engraver : public Engraver
15 {
16   Spanner *span_;
17
18 public:
19   TRANSLATOR_DECLARATIONS (Ledger_line_engraver);
20
21 protected:
22   virtual void finalize ();
23   void process_music ();
24
25   DECLARE_ACKNOWLEDGER (ledgered);
26   DECLARE_ACKNOWLEDGER (staff_symbol);
27
28   void start_spanner ();
29   void stop_spanner ();
30 };
31
32 Ledger_line_engraver::Ledger_line_engraver ()
33 {
34   span_ = 0;
35 }
36
37 void
38 Ledger_line_engraver::start_spanner ()
39 {
40   assert (!span_);
41   span_ = make_spanner ("LedgerLineSpanner", SCM_EOL);
42
43   span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
44 }
45
46 void
47 Ledger_line_engraver::process_music ()
48 {
49   /*
50     Need to do this, otherwise the first note might miss ledgers. 
51   */
52   if (!span_)
53     start_spanner ();
54 }
55
56 void
57 Ledger_line_engraver::finalize ()
58 {
59   stop_spanner ();
60 }
61
62 void
63 Ledger_line_engraver::stop_spanner ()
64 {
65   if (span_)
66     {
67       span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
68       Pointer_group_interface::set_ordered (span_, ly_symbol2scm ("elements"), false);
69       span_ = 0;
70     }
71 }
72
73 void
74 Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s)
75 {
76   Spanner *sym = dynamic_cast<Spanner *> (s.grob ());
77
78   if (!span_
79       || (span_->get_bound (LEFT) != sym->get_bound (LEFT)
80           && sym->get_bound (LEFT)))
81     {
82       stop_spanner ();
83       start_spanner ();
84     }
85 }
86
87 void
88 Ledger_line_engraver::acknowledge_ledgered (Grob_info s)
89 {
90   if (span_)
91     {
92       if (!to_boolean (s.grob ()->get_property ("no-ledgers")))
93         Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"),
94                                            s.grob ());
95     }
96 }
97
98 #include "translator.icc"
99
100 ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered);
101 ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol);
102 ADD_TRANSLATOR (Ledger_line_engraver,
103                 "Creates the spanner to draw ledger lines, and notices objects that need ledger lines",
104                 /* create */ "LedgerLineSpanner",
105                 /* accept */ "",
106                 /* read */ "",
107                 /* write */ "")