]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bow.cc
release: 1.2.7
[lilypond.git] / lily / bow.cc
index 30e82e05e2ec5616f4674cabd480e55344621d5e..f3c4e59eeb638649971f9c386b04899fedc560c9 100644 (file)
@@ -3,17 +3,17 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-      Jan Nieuwenhuizen <jan@digicash.com>
+  (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"
-
-IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
+#include "main.hh"
 
 Bow::Bow ()
 {
@@ -22,42 +22,60 @@ Bow::Bow ()
 }
 
 Molecule*
-Bow::brew_molecule_p () const
+Bow::do_brew_molecule_p () const
 {
-  Molecule* mol_p = new Molecule;
-  
+  Real thick = paper_l ()->get_var ("slur_thickness");
   Array<Offset> c = get_controls ();
-  Atom a = paper ()->lookup_l ()->slur (c);
-//  a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
-  a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT] - c[0].y ()));
 
-  mol_p->add (a);
+  Molecule a;
+
+  SCM d =  get_elt_property (dashed_scm_sym);
+  if (d == SCM_BOOL_F)
+    a = lookup_l ()->slur (c, thick);
+  else
+    a = lookup_l ()->dashed_slur (c, thick, gh_scm2int (SCM_CDR(d)));
 
-  return mol_p;
+  return new Molecule (a); 
 }
 
 Offset
 Bow::center () const
 {
   Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
-
-  Real dx = width ().length ();
+  Real dx =  extent(X_AXIS).length ();
 
   return Offset (dx / 2, dy);
 }
 
+/*
+   Ugh.  Control points are too crude measures.
+ */
 Interval
-Bow::do_width () const    
+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;
+}
+
+Drul_array<Interval>
+Bow::curve_extent_drul () const
 {
-  Interval i = Spanner::do_width ();
-  Real dx = i.length();
-  return Interval (0, dx);
+  Bezier_bow b (paper_l ());
+  b.set (get_encompass_offset_arr (), dir_);
+  b.calc ();
+  return b.curve_extent_drul_;
 }
 
 Array<Offset>
 Bow::get_controls () const
 {
-  Bezier_bow b (paper ());
+  Bezier_bow b (paper_l ());
   b.set (get_encompass_offset_arr (), dir_);
   b.calc ();
   Array<Offset> controls;
@@ -72,14 +90,11 @@ Bow::get_controls () const
 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;
+  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;
 }