]> git.donarmstrong.com Git - lilypond.git/blob - lily/bow.cc
release: 1.1.30
[lilypond.git] / lily / bow.cc
1 /*
2   bow.cc -- implement Bow
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7       Jan Nieuwenhuizen <janneke@gnu.org>
8 */
9
10 #include "bow.hh"
11 #include "debug.hh"
12 #include "paper-def.hh"
13 #include "molecule.hh"
14 #include "lookup.hh"
15 #include "bezier.hh"
16 #include "main.hh"
17
18
19
20 Bow::Bow ()
21 {
22   dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
23   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
24   dash_i_ = 0;
25   interstaff_f_ = 0;
26   vertical_align_drul_[MIN] = 0;
27   vertical_align_drul_[MAX] = -1;
28 }
29
30 Molecule*
31 Bow::do_brew_molecule_p () const
32 {
33   Real thick = paper ()->get_var ("slur_thickness");
34   Array<Offset> c = get_controls ();
35   Real dy = c[3].y () - c[0].y ();
36   Molecule a;
37
38   if (!dash_i_)
39     a = lookup_l ()->slur (c);
40   else
41     a = lookup_l ()->dashed_slur (c, thick, dash_i_);
42
43   if (check_debug && !monitor->silent_b ("Bow"))
44     {
45       static int i = 1;
46       cout << "******" << i++ << "******" << endl;
47       // gcc 2.7.2: ices
48 //      cout << "c0.y: " << c[0].y << endl;
49       cout << "c0.y: " << c[0].y () << endl;
50       cout << "c3.y: " << c[3].y () << endl;
51       cout << "dy: " << dy << endl;
52       cout << "dy_f_l: " << dy_f_drul_[LEFT] << endl;
53       cout << "dy_f_r: " << dy_f_drul_[RIGHT] << endl;
54       cout << "dy_f: " << dy_f_drul_[RIGHT] - dy_f_drul_[LEFT] << endl;
55     }
56   a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
57
58   Molecule* mol_p = new Molecule;
59   mol_p->add_molecule (a);
60   mol_p->translate_axis (-interstaff_f_, Y_AXIS);
61
62   return mol_p;
63 }
64
65 Offset
66 Bow::center () const
67 {
68   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
69
70   Real dx =  extent(X_AXIS).length ();
71
72   return Offset (dx / 2, dy);
73 }
74
75
76
77 /*
78    
79    ugh .  Control points are too crude measures.
80  */
81 Interval
82 Bow::do_height () const
83 {
84   Interval iv;
85   Array<Offset> c (get_controls());
86   for (int i=0; i < c.size (); i++)
87     {
88       Real y = c[i][Y_AXIS];
89       iv.unite (Interval (y,y));
90     }
91   iv -= interstaff_f_;
92   return iv;
93 }
94
95 #if 0
96 Interval
97 Bow::do_width () const    
98 {
99   Interval i = Spanner::do_width ();
100   Real dx = i.length();
101   return Interval (0, dx);
102 }
103 #endif
104
105 Array<Offset>
106 Bow::get_controls () const
107 {
108   Bezier_bow b (paper ());
109   b.set (get_encompass_offset_arr (), dir_);
110   b.calc ();
111   Array<Offset> controls;
112   controls.set_size (8);
113   for (int i = 0; i < 4; i++)
114     controls[i] = b.control_[i];
115   for (int i = 0; i < 4; i++)
116     controls[i + 4] = b.return_[i];
117   return controls;
118 }
119
120 Array<Offset>
121 Bow::get_encompass_offset_arr () const
122 {
123   Offset d (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT],
124     dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
125   d.x() += extent (X_AXIS). length ();
126
127   Array<Offset> notes;
128   notes.push (Offset (0, 0));
129   notes.push (d);
130
131   return notes;
132 }
133