]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-spanner.cc
9be7106bef5a886b697f1202271503f945fd7f62
[lilypond.git] / lily / extender-spanner.cc
1 /*
2   extender-spanner.cc -- implement Extender_spanner
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1998 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9
10 #include "box.hh"
11 #include "debug.hh"
12 #include "lookup.hh"
13 #include "molecule.hh"
14 #include "p-col.hh"
15 #include "paper-def.hh"
16 #include "extender-spanner.hh"
17 #include "text-def.hh"
18
19 Extender_spanner::Extender_spanner ()
20   : Directional_spanner ()
21 {
22   item_l_drul_[LEFT] = item_l_drul_[RIGHT] = 0;
23   dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
24   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
25 }
26
27 Extender_spanner::Extender_spanner (Extender_spanner const& c)
28   : Directional_spanner (c)
29 {
30   item_l_drul_ = c.item_l_drul_;
31   dy_f_drul_ = c.dy_f_drul_;
32   dx_f_drul_ = c.dx_f_drul_;
33 }
34
35 Extender_spanner::~Extender_spanner ()
36 {
37 }
38
39 Offset
40 Extender_spanner::center () const
41 {
42   Real dx = extent (X_AXIS).length ();
43
44   return Offset (dx / 2, 0);
45 }
46
47 Molecule*
48 Extender_spanner::do_brew_molecule_p () const
49 {
50   Molecule* mol_p = new Molecule;
51
52   Real w = extent (X_AXIS).length ();
53   
54   w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
55   Real h = paper ()->get_realvar (ly_symbol ("extender_height"));
56   Molecule a = lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h)));
57   a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
58
59   mol_p->add_molecule (a);
60
61   return mol_p;
62 }
63
64 void
65 Extender_spanner::do_add_processing ()
66 {
67   Direction d = LEFT;
68   Drul_array<Item *> new_textitem_drul = item_l_drul_;
69   do {
70     if (!item_l_drul_[d])
71       new_textitem_drul[d] = item_l_drul_[(Direction)-d];
72   } while (flip(&d) != LEFT);
73   item_l_drul_ = new_textitem_drul;
74 }
75
76 Interval
77 Extender_spanner::do_height () const
78 {
79   return Interval (0,0);
80 }
81
82 void
83 Extender_spanner::do_post_processing ()
84 {
85   assert (item_l_drul_[LEFT] || item_l_drul_[RIGHT]);
86
87   // UGH
88   Real nw_f = paper ()->note_width () * 0.8;
89
90   Direction d = LEFT;
91   do
92     {
93       Item* t = item_l_drul_[d]
94         ? item_l_drul_[d] : item_l_drul_[(Direction)-d];
95       if (d == LEFT)
96         dx_f_drul_[d] += t->extent (X_AXIS).length ();
97       else
98         dx_f_drul_[d] -= d * nw_f / 2;
99     }
100   while (flip(&d) != LEFT);
101 }
102
103 void
104 Extender_spanner::do_substitute_dependency (Score_element* o, Score_element* n)
105 {
106   Item* new_l = n ? dynamic_cast<Item *> (n) : 0;
107   if (dynamic_cast <Item *> (o) == item_l_drul_[LEFT])
108     item_l_drul_[LEFT] = new_l;
109   else if (dynamic_cast <Item *> (o) == item_l_drul_[RIGHT])
110     item_l_drul_[RIGHT] = new_l;
111 }
112   
113 void
114 Extender_spanner::set_textitem (Direction d, Item* textitem_l)
115 {
116   assert (!item_l_drul_[d]);
117   item_l_drul_[d] = textitem_l;
118   set_bounds (d, textitem_l);
119
120   add_dependency (textitem_l);
121 }
122