]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bow.cc
release: 0.1.58
[lilypond.git] / lily / bow.cc
index 9433f69a18d57bcc55f793e0c02e2b286c958680..8be81c4f61a867bed6f72256e8ae345b6131993a 100644 (file)
@@ -4,58 +4,84 @@
   source file of the GNU LilyPond music typesetter
 
   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+      Jan Nieuwenhuizen <jan@digicash.com>
 */
 
 #include "bow.hh"
 #include "paper-def.hh"
 #include "molecule.hh"
 #include "lookup.hh"
+#include "bezier.hh"
 
 IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
 
 Bow::Bow ()
 {
-  dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0;
+  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;
+  
+  Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+  
+  Real dx_f = width ().length ();
+  dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+  
+  Atom a = paper ()->lookup_l ()->slur (get_controls ());
+
+  a.translate (Offset (dx_f + dx_f_drul_[LEFT], dy_f + 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 dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
 
-  Real w = width ().length ();
+  Real dx = width ().length ();
 
-  return Offset (w/2,dy );
+  return Offset (dx / 2, dy);
 }
 
-Molecule*
-Bow::brew_molecule_p () const
+Interval
+Bow::do_width () const    
 {
-  Molecule*output = new Molecule;
-  Real w = width ().length ();
-  
-  Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
-  
-  Real nw_f = paper ()->note_width ();
-  
-  w+= (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
-  Real round_w = w;            // slur lookup rounds the slurwidth .
-  
-  Atom a = paper ()->lookup_l ()->slur (dy_f, round_w, height_f (), dir_);
-
-  Real error = w-round_w;
-  a.translate (Offset ( (dx_f_drul_[LEFT] + 0.5*nw_f)
-                      + error/2,
-                      dy_f_drul_[LEFT]));
-  output->add (a);
-  return output;
+  Interval i = Spanner::do_width ();
+  Real dx = i.length();
+  return Interval (0, dx);
 }
 
-Real
-Bow::height_f () const
+Array<Offset>
+Bow::get_controls () const
 {
-  return 0;
+  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
+{
+  Real dx = width (). length ();
+  dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+  Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+
+  Array<Offset> notes;
+  notes.push (Offset (0,0));
+  notes.push (Offset (dx, dy));
+
+  return notes;
 }