]> git.donarmstrong.com Git - lilypond.git/blob - lily/bow.cc
48477b983738e66dd00c731b62e660b8788f4e97
[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 "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 IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
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 }
25
26 Molecule*
27 Bow::brew_molecule_p () const
28 {
29   Molecule* mol_p = new Molecule;
30   
31   Array<Offset> c = get_controls ();
32   Atom a = paper ()->lookup_l ()->slur (c);
33   Real dy = c[3].y () - c[0].y ();
34   if (check_debug && !monitor->silent_b ("Bow"))
35     {
36       static int i = 1;
37       cout << "******" << i++ << "******" << endl;
38       // gcc 2.7.2: ices
39 //      cout << "c0.y: " << c[0].y << endl;
40       cout << "c0.y: " << c[0].y () << endl;
41       cout << "c3.y: " << c[3].y () << endl;
42       cout << "dy: " << dy << endl;
43       cout << "dy_f_l: " << dy_f_drul_[LEFT] << endl;
44       cout << "dy_f_r: " << dy_f_drul_[RIGHT] << endl;
45       cout << "dy_f: " << dy_f_drul_[RIGHT] - dy_f_drul_[LEFT] << endl;
46     }
47   a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
48
49   mol_p->add (a);
50
51   return mol_p;
52 }
53
54 Offset
55 Bow::center () const
56 {
57   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
58
59   Real dx = width ().length ();
60
61   return Offset (dx / 2, dy);
62 }
63
64 Interval
65 Bow::do_width () const    
66 {
67   Interval i = Spanner::do_width ();
68   Real dx = i.length();
69   return Interval (0, dx);
70 }
71
72 Array<Offset>
73 Bow::get_controls () const
74 {
75   Bezier_bow b (paper ());
76   b.set (get_encompass_offset_arr (), dir_);
77   b.calc ();
78   Array<Offset> controls;
79   controls.set_size (8);
80   for (int i = 0; i < 4; i++)
81     controls[i] = b.control_[i];
82   for (int i = 0; i < 4; i++)
83     controls[i + 4] = b.return_[i];
84   return controls;
85 }
86
87 Array<Offset>
88 Bow::get_encompass_offset_arr () const
89 {
90   Real dx = width (). length ();
91   dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
92   Real left_x = 0;
93   Real interline = paper ()->interline_f ();
94   if (dx < 2.0 * interline)
95     {
96       left_x = - 3.0 * interline;
97       dx = 2.0 * interline;
98     }
99   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
100
101 #define RESIZE_ICE
102 #ifndef RESIZE_ICE
103   Array<Offset> notes;
104   notes.push (Offset (left_x, 0));
105   notes.push (Offset (left_x + dx, dy));
106 #else
107   Array<Offset> notes (2);
108   notes[0] = Offset (left_x, 0);
109   notes[1] = Offset (left_x + dx, dy);
110 #endif
111
112   return notes;
113 }
114