lilypond-1.1.67
[lilypond.git] / lily / bow.cc
bloba72e2fe4337ef56dc0108e3427799e46c43744e6
1 /*
2 bow.cc -- implement Bow
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
8 */
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"
18 Bow::Bow ()
20 dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
21 dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
24 Molecule*
25 Bow::do_brew_molecule_p () const
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;
32 SCM d = get_elt_property (dashed_scm_sym);
33 if (d == SCM_BOOL_F)
34 a = lookup_l ()->slur (c, thick);
35 else
36 a = lookup_l ()->dashed_slur (c, thick, gh_scm2int (SCM_CDR(d)));
38 if (check_debug && !monitor->silent_b ("Bow"))
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;
49 return new Molecule (a);
52 Offset
53 Bow::center () const
55 Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
56 Real dx = extent(X_AXIS).length ();
58 return Offset (dx / 2, dy);
62 Ugh. Control points are too crude measures.
64 Interval
65 Bow::do_height () const
67 Interval iv;
68 Array<Offset> c (get_controls());
69 for (int i=0; i < c.size (); i++)
71 Real y = c[i][Y_AXIS];
72 iv.unite (Interval (y,y));
74 return iv;
77 Drul_array<Interval>
78 Bow::curve_extent_drul () const
80 Bezier_bow b (paper_l ());
81 b.set (get_encompass_offset_arr (), dir_);
82 b.calc ();
83 return b.curve_extent_drul_;
86 Array<Offset>
87 Bow::get_controls () const
89 Bezier_bow b (paper_l ());
90 b.set (get_encompass_offset_arr (), dir_);
91 b.calc ();
92 Array<Offset> controls;
93 controls.set_size (8);
94 for (int i = 0; i < 4; i++)
95 controls[i] = b.control_[i];
96 for (int i = 0; i < 4; i++)
97 controls[i + 4] = b.return_[i];
98 return controls;
101 Array<Offset>
102 Bow::get_encompass_offset_arr () const
104 Array<Offset> offset_arr;
105 offset_arr.push (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
106 offset_arr.push (Offset (do_width ().length () + dx_f_drul_[RIGHT],
107 dy_f_drul_[RIGHT]));
109 return offset_arr;