2 extender-spanner.cc -- implement Extender_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
13 #include "molecule.hh"
15 #include "paper-def.hh"
16 #include "extender-spanner.hh"
17 #include "text-def.hh"
19 Extender_spanner::Extender_spanner ()
20 : Directional_spanner ()
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;
27 Extender_spanner::Extender_spanner (Extender_spanner const& c)
28 : Directional_spanner (c)
30 item_l_drul_ = c.item_l_drul_;
31 dy_f_drul_ = c.dy_f_drul_;
32 dx_f_drul_ = c.dx_f_drul_;
35 Extender_spanner::~Extender_spanner ()
40 Extender_spanner::center () const
42 Real dx = extent (X_AXIS).length ();
44 return Offset (dx / 2, 0);
48 Extender_spanner::do_brew_molecule_p () const
50 Molecule* mol_p = new Molecule;
52 Real w = extent (X_AXIS).length ();
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]));
59 mol_p->add_molecule (a);
65 Extender_spanner::do_add_processing ()
68 Drul_array<Item *> new_textitem_drul = item_l_drul_;
71 new_textitem_drul[d] = item_l_drul_[(Direction)-d];
72 } while (flip(&d) != LEFT);
73 item_l_drul_ = new_textitem_drul;
77 Extender_spanner::do_height () const
79 return Interval (0,0);
83 Extender_spanner::do_post_processing ()
85 assert (item_l_drul_[LEFT] || item_l_drul_[RIGHT]);
88 Real nw_f = paper ()->note_width () * 0.8;
93 Item* t = item_l_drul_[d]
94 ? item_l_drul_[d] : item_l_drul_[(Direction)-d];
96 dx_f_drul_[d] += t->extent (X_AXIS).length ();
98 dx_f_drul_[d] -= d * nw_f / 2;
100 while (flip(&d) != LEFT);
104 Extender_spanner::do_substitute_dependency (Score_element* o, Score_element* n)
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;
114 Extender_spanner::set_textitem (Direction d, Item* textitem_l)
116 assert (!item_l_drul_[d]);
117 item_l_drul_[d] = textitem_l;
118 set_bounds (d, textitem_l);
120 add_dependency (textitem_l);