]> git.donarmstrong.com Git - lilypond.git/blob - lily/lyric-extender.cc
partial: 1.3.56.jcn
[lilypond.git] / lily / lyric-extender.cc
1 /*
2   lyric-extender.cc -- implement Lyric_extender
3   source file of the GNU LilyPond music typesetter
4
5   (c)  1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
6 */
7
8 /*
9   TODO: too complicated implementation.  Why the dx_drul?.
10  */
11
12 #
13 #include "dimension-cache.hh"
14 #include "box.hh"
15 #include "debug.hh"
16 #include "lookup.hh"
17 #include "molecule.hh"
18 #include "paper-column.hh"
19 #include "paper-def.hh"
20 #include "extender-spanner.hh"
21
22 Lyric_extender::Lyric_extender (SCM s)
23   : Spanner (s)
24
25 {
26   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
27   set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
28 }
29
30
31
32
33 MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Lyric_extender)
34 Molecule 
35 Lyric_extender::do_brew_molecule () const
36 {
37   Molecule  mol;
38
39   Real w = spanner_length ();
40   
41   w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
42   Real h = paper_l ()->get_var ("extender_height");
43   Molecule a = lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h)));
44   a.translate (Offset (dx_f_drul_[LEFT], 0));
45
46   mol.add_molecule (a);
47
48   return mol;
49 }
50
51
52
53 void
54 Lyric_extender::after_line_breaking ()
55 {
56   // UGH
57   Real gap = paper_l ()->get_var ("interline");
58
59   Direction d = LEFT;
60   do
61     {
62       Item* t = get_bound (d)
63         ? get_bound (d) : get_bound ((Direction)-d);
64       if (d == LEFT)
65         dx_f_drul_[d] += t->extent (X_AXIS).length ();
66       else
67         dx_f_drul_[d] -= d * gap / 2;
68     }
69   while (flip(&d) != LEFT);
70 }
71
72   
73 void
74 Lyric_extender::set_textitem (Direction d, Item* textitem_l)
75 {
76   set_bound (d, textitem_l);
77   add_dependency (textitem_l);
78 }
79
80