]> git.donarmstrong.com Git - lilypond.git/blob - lily/bow.cc
release: 0.1.59
[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 Han-Wen Nienhuys <hanwen@stack.nl>
7       Jan Nieuwenhuizen <jan@digicash.com>
8 */
9
10 #include "bow.hh"
11 #include "paper-def.hh"
12 #include "molecule.hh"
13 #include "lookup.hh"
14 #include "bezier.hh"
15
16 IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
17
18 Bow::Bow ()
19 {
20   dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
21   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
22 }
23
24 Molecule*
25 Bow::brew_molecule_p () const
26 {
27   Molecule* mol_p = new Molecule;
28   
29   Array<Offset> c = get_controls ();
30   Atom a = paper ()->lookup_l ()->slur (c);
31 //  a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
32   a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT] - c[0].y ()));
33
34   mol_p->add (a);
35
36   return mol_p;
37 }
38
39 Offset
40 Bow::center () const
41 {
42   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
43
44   Real dx = width ().length ();
45
46   return Offset (dx / 2, dy);
47 }
48
49 Interval
50 Bow::do_width () const    
51 {
52   Interval i = Spanner::do_width ();
53   Real dx = i.length();
54   return Interval (0, dx);
55 }
56
57 Array<Offset>
58 Bow::get_controls () const
59 {
60   Bezier_bow b (paper ());
61   b.set (get_encompass_offset_arr (), dir_);
62   b.calc ();
63   Array<Offset> controls;
64   controls.set_size (8);
65   for (int i = 0; i < 4; i++)
66     controls[i] = b.control_[i];
67   for (int i = 0; i < 4; i++)
68     controls[i + 4] = b.return_[i];
69   return controls;
70 }
71
72 Array<Offset>
73 Bow::get_encompass_offset_arr () const
74 {
75   Real dx = width (). length ();
76   dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
77   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
78
79   Array<Offset> notes;
80   notes.push (Offset (0,0));
81   notes.push (Offset (dx, dy));
82
83   return notes;
84 }
85