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