]> git.donarmstrong.com Git - lilypond.git/blob - lily/bow.cc
release: 1.2.7
[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
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, thick);
35   else
36     a = lookup_l ()->dashed_slur (c, thick, gh_scm2int (SCM_CDR(d)));
37
38   return new Molecule (a); 
39 }
40
41 Offset
42 Bow::center () const
43 {
44   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
45   Real dx =  extent(X_AXIS).length ();
46
47   return Offset (dx / 2, dy);
48 }
49
50 /*
51    Ugh.  Control points are too crude measures.
52  */
53 Interval
54 Bow::do_height () const
55 {
56   Interval iv;
57   Array<Offset> c (get_controls());
58   for (int i=0; i < c.size (); i++)
59     {
60       Real y = c[i][Y_AXIS];
61       iv.unite (Interval (y,y));
62     }
63   return iv;
64 }
65
66 Drul_array<Interval>
67 Bow::curve_extent_drul () const
68 {
69   Bezier_bow b (paper_l ());
70   b.set (get_encompass_offset_arr (), dir_);
71   b.calc ();
72   return b.curve_extent_drul_;
73 }
74
75 Array<Offset>
76 Bow::get_controls () const
77 {
78   Bezier_bow b (paper_l ());
79   b.set (get_encompass_offset_arr (), dir_);
80   b.calc ();
81   Array<Offset> controls;
82   controls.set_size (8);
83   for (int i = 0; i < 4; i++)
84     controls[i] = b.control_[i];
85   for (int i = 0; i < 4; i++)
86     controls[i + 4] = b.return_[i];
87   return controls;
88 }
89
90 Array<Offset>
91 Bow::get_encompass_offset_arr () const
92 {
93   Array<Offset> offset_arr;
94   offset_arr.push (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
95   offset_arr.push (Offset (do_width ().length () + dx_f_drul_[RIGHT],
96                       dy_f_drul_[RIGHT]));
97                       
98   return offset_arr;
99 }
100