blob: 770fd8a9735feffce6bf5a67087a5e5b1207fbeb (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/*
bow.cc -- implement Bow
source file of the GNU LilyPond music typesetter
(c) 1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
Jan Nieuwenhuizen <jan@digicash.com>
*/
#include "bow.hh"
#include "debug.hh"
#include "paper-def.hh"
#include "molecule.hh"
#include "lookup.hh"
#include "bezier.hh"
#include "main.hh"
IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
Bow::Bow ()
{
dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
}
Molecule*
Bow::brew_molecule_p () const
{
Molecule* mol_p = new Molecule;
Array<Offset> c = get_controls ();
Atom a = paper ()->lookup_l ()->slur (c);
Real dy = c[3].y () - c[0].y ();
if (check_debug && !monitor->silent_b ("Bow"))
{
static int i = 1;
cout << "******" << i++ << "******" << endl;
// gcc 2.7.2: ices
// cout << "c0.y: " << c[0].y << endl;
cout << "c0.y: " << c[0].y () << endl;
cout << "c3.y: " << c[3].y () << endl;
cout << "dy: " << dy << endl;
cout << "dy_f_l: " << dy_f_drul_[LEFT] << endl;
cout << "dy_f_r: " << dy_f_drul_[RIGHT] << endl;
cout << "dy_f: " << dy_f_drul_[RIGHT] - dy_f_drul_[LEFT] << endl;
}
a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
mol_p->add (a);
return mol_p;
}
Offset
Bow::center () const
{
Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
Real dx = width ().length ();
return Offset (dx / 2, dy);
}
Interval
Bow::do_width () const
{
Interval i = Spanner::do_width ();
Real dx = i.length();
return Interval (0, dx);
}
Array<Offset>
Bow::get_controls () const
{
Bezier_bow b (paper ());
b.set (get_encompass_offset_arr (), dir_);
b.calc ();
Array<Offset> controls;
controls.set_size (8);
for (int i = 0; i < 4; i++)
controls[i] = b.control_[i];
for (int i = 0; i < 4; i++)
controls[i + 4] = b.return_[i];
return controls;
}
Array<Offset>
Bow::get_encompass_offset_arr () const
{
Offset d (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT],
dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
d.x() += width (). length ();
#define RESIZE_ICE
#ifndef RESIZE_ICE
Array<Offset> notes;
notes.push (Offset 0, 0));
notes.push (d);
#else
Array<Offset> notes (2);
notes[0] = Offset (0, 0);
notes[1] = Offset (d);
#endif
return notes;
}
|