]> git.donarmstrong.com Git - lilypond.git/blob - lily/bow.cc
release: 1.1.50
[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 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::do_brew_molecule_p () const
26 {
27   Real thick = paper_l ()->get_var ("slur_thickness");
28   Array<Offset> c = get_controls ();
29   Real dy = c[3].y () - c[0].y ();
30   Molecule a;
31
32   SCM d =  get_elt_property (dashed_scm_sym);
33   if (d == SCM_BOOL_F)
34     a = lookup_l ()->slur (c);
35   else
36     a = lookup_l ()->dashed_slur (c, thick, gh_scm2int (SCM_CDR(d)));
37
38   if (check_debug && !monitor->silent_b ("Bow"))
39     {
40       static int i = 1;
41       cout << "******" << i++ << "******" << endl;
42       cout << "c0.y: " << c[0].y () << endl;
43       cout << "c3.y: " << c[3].y () << endl;
44       cout << "dy: " << dy << endl;
45       cout << "dy_f_l: " << dy_f_drul_[LEFT] << endl;
46       cout << "dy_f_r: " << dy_f_drul_[RIGHT] << endl;
47       cout << "dy_f: " << dy_f_drul_[RIGHT] - dy_f_drul_[LEFT] << endl;
48     }
49   a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
50
51   return new Molecule (a); 
52 }
53
54 Offset
55 Bow::center () const
56 {
57   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
58   Real dx =  extent(X_AXIS).length ();
59
60   return Offset (dx / 2, dy);
61 }
62
63
64
65 /*
66    Ugh.  Control points are too crude measures.
67  */
68 Interval
69 Bow::do_height () const
70 {
71   Interval iv;
72   Array<Offset> c (get_controls());
73   for (int i=0; i < c.size (); i++)
74     {
75       Real y = c[i][Y_AXIS] + dy_f_drul_[LEFT];
76       iv.unite (Interval (y,y));
77     }
78   return iv;
79 }
80
81
82 Array<Offset>
83 Bow::get_controls () const
84 {
85   Bezier_bow b (paper_l ());
86   b.set (get_encompass_offset_arr (), dir_);
87   b.calc ();
88   Array<Offset> controls;
89   controls.set_size (8);
90   for (int i = 0; i < 4; i++)
91     controls[i] = b.control_[i];
92   for (int i = 0; i < 4; i++)
93     controls[i + 4] = b.return_[i];
94   return controls;
95 }
96
97 Array<Offset>
98 Bow::get_encompass_offset_arr () const
99 {
100   Offset d (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT],
101     dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
102   d.x() += extent (X_AXIS). length ();
103
104   Array<Offset> notes;
105   notes.push (Offset (0, 0));
106   notes.push (d);
107
108   return notes;
109 }
110