]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bow.cc
release: 1.3.8
[lilypond.git] / lily / bow.cc
index 5e463408e125c3a8c36a55df147d1ba654700101..6033cfe926b4dd0190dbc9233c06abfe2f63af05 100644 (file)
 /*
   bow.cc -- implement Bow
 
-  source file of the LilyPond music typesetter
+  source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+      Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "bow.hh"
+#include "debug.hh"
 #include "paper-def.hh"
+#include "molecule.hh"
 #include "lookup.hh"
+#include "bezier.hh"
+#include "main.hh"
 
-Bow::Bow()
+Bow::Bow ()
 {
-    left_pos_i_ = right_pos_i_ = 0;
-    left_dx_f_ = right_dx_f_ = 0.0;
+  dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
+  dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
 }
 
+Molecule*
+Bow::do_brew_molecule_p () const
+{
+  Real thick = paper_l ()->get_var ("slur_thickness");
+  Array<Offset> c = get_controls ();
+
+  Molecule a;
+
+  SCM d =  get_elt_property ("dashed");
+  if (d == SCM_UNDEFINED)
+    a = lookup_l ()->slur (c, thick);
+  else
+    a = lookup_l ()->dashed_slur (c, thick, gh_scm2int (d));
+
+  return new Molecule (a); 
+}
 
 Offset
-Bow::center() const
+Bow::center () const
 {
-    int dy =  right_pos_i_-left_pos_i_;
+  Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+  Real dx =  extent(X_AXIS).length ();
 
-    Real w = width().length();
+  return Offset (dx / 2, dy);
+}
 
-    return Offset(w/2,dy * paper()->internote());
+/*
+   Ugh.  Control points are too crude measures.
+ */
+Interval
+Bow::do_height () const
+{
+  Interval iv;
+  Array<Offset> c (get_controls());
+  for (int i=0; i < c.size (); i++)
+    {
+      Real y = c[i][Y_AXIS];
+      iv.unite (Interval (y,y));
+    }
+  return iv;
 }
 
-Molecule*
-Bow::brew_molecule_p() const
+Drul_array<Interval>
+Bow::curve_extent_drul () const
+{
+  Bezier_bow b (paper_l ());
+  b.set (get_encompass_offset_arr (), get_direction ());
+  b.calc ();
+  return b.curve_extent_drul_;
+}
+
+Array<Offset>
+Bow::get_controls () const
 {
-    Molecule*output = new Molecule;
-    Real w = width().length();
-    
-    int dy = right_pos_i_ - left_pos_i_;
-    
-    Real nw_f = paper()->note_width();
-    Real nh_f = paper()->internote();
-
-    
-    w+= (right_dx_f_ - left_dx_f_) * nw_f ;
-    Real round_w = w;          // slur lookup rounds the slurwidth .
-    
-    Symbol sl = paper()->lookup_l()->slur(dy , round_w, dir_i_);
-
-    Real error = w-round_w;
-    
-    Atom a(sl);
-    a.translate(Offset((left_dx_f_ + 0.5 )*nw_f + error/2,
-                      left_pos_i_ * nh_f));
-    output->add(a);
-    return output;
+  Bezier_bow b (paper_l ());
+  b.set (get_encompass_offset_arr (), get_direction ());
+  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;
 }
 
-IMPLEMENT_STATIC_NAME(Bow);
+Array<Offset>
+Bow::get_encompass_offset_arr () const
+{
+  Array<Offset> offset_arr;
+  offset_arr.push (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
+  offset_arr.push (Offset (do_width ().length () + dx_f_drul_[RIGHT],
+                     dy_f_drul_[RIGHT]));
+                     
+  return offset_arr;
+}
+
+