]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/include/bezier-bow.hh: remove.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 28 Aug 2004 16:37:40 +0000 (16:37 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 28 Aug 2004 16:37:40 +0000 (16:37 +0000)
* lily/slur-bezier-bow.cc (Module): remove.

* lily/include/slur.hh (Module): remove.

* lily/slur.cc: remove

* lily/slur-quanting.cc (after_line_breaking): only do scoring
when less than 4 control-points.

* lily/slur-quanting.cc (get_bezier): new functionality, blow up
slur depending on extents of note heads.

13 files changed:
ChangeLog
lily/bezier-bow.cc
lily/include/bezier-bow.hh [deleted file]
lily/include/bezier.hh
lily/include/slur.hh [deleted file]
lily/new-slur.cc
lily/rhythmic-column-engraver.cc
lily/slur-bezier-bow.cc [deleted file]
lily/slur-quanting.cc
lily/slur.cc [deleted file]
lily/tie.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 6ecb6fa610d3a90f7bffbc988d035089d87a27b4..b647338ffebeaf50999af2c4ea0dfe36a631521c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2004-08-28  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * lily/include/bezier-bow.hh: remove.
+
+       * lily/slur-bezier-bow.cc (Module): remove.
+
+       * lily/include/slur.hh (Module): remove.
+
+       * lily/slur.cc: remove
+
        * input/test/slur-beautiful.ly (Module): remove
 
        * input/test/slur-attachment-override.ly (Module): remove
index 7d7b640a54ff40ff6a2900685c3efef7b9e222bb..06f6cc211846bed34a8be22e211197b00a100f77 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <math.h>
 
-#include "bezier-bow.hh"
 #include "misc.hh"
 #include "bezier.hh"
 
diff --git a/lily/include/bezier-bow.hh b/lily/include/bezier-bow.hh
deleted file mode 100644 (file)
index a53ad18..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*   
-  bezier-bow.hh -- declare Bezier_bow
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef BEZIER_BOW_HH
-#define BEZIER_BOW_HH
-
-#include "bezier.hh"
-#include "lily-proto.hh"
-#include "lily-guile.hh"
-
-
-
-Bezier slur_shape (Real width, Real height_limit,
-                  Real height_proportion);
-Real slur_height (Real width, Real height_limit, Real height_proportion); 
-void get_slur_indent_height (Real * indent, Real *height, Real width, Real h_inf, Real r_0);
-#endif /* BEZIER_BOW_HH */
-
index b4ded08818c95a3147b3127e2f65915bbea8c88d..c7317be581aa39dc1003e1b3dcd482a43c8bd9c3 100644 (file)
@@ -49,5 +49,12 @@ void scale (Array<Offset>* array, Real xscale, Real yscale);
 void rotate (Array<Offset>* array, Real phi);
 void translate (Array<Offset>* array, Offset o);
 
+
+
+Bezier slur_shape (Real width, Real height_limit,
+                  Real height_proportion);
+Real slur_height (Real width, Real height_limit, Real height_proportion); 
+void get_slur_indent_height (Real * indent, Real *height, Real width, Real h_inf, Real r_0);
+
 #endif // BEZIER_HH
 
diff --git a/lily/include/slur.hh b/lily/include/slur.hh
deleted file mode 100644 (file)
index 4dc2450..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-  slur.hh -- declare Slur
-
-  (c) 1996--2004 Han-Wen Nienhuys
-*/
-
-#ifndef SLUR_HH
-#define SLUR_HH
-
-#include "lily-guile.hh"
-#include "lily-proto.hh"
-#include "rod.hh"
-
-class Old_slur
-{
-public:
-  static void add_column (Grob *me, Grob *col);
-  DECLARE_SCHEME_CALLBACK (print, (SCM));
-  static void set_interface (Grob*);
-  static bool  has_interface (Grob*);
-  static Array<Offset> get_encompass_offsets (Grob *me);
-  static Bezier get_curve (Grob *me);
-  static Direction get_default_dir (Grob *me);
-  DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
-
-  DECLARE_SCHEME_CALLBACK (height, (SCM,SCM));
-private:  
-  static Real get_boundary_notecolumn_y (Grob *me, Direction dir);
-  static Offset broken_trend_offset (Grob *me, Direction dir);
-  static Offset get_attachment (Grob *me,Direction dir, Grob **common);
-  static void de_uglify (Grob *me,Slur_bezier_bow* bb, Real default_height);
-  static SCM set_extremities (Grob *me);
-  static void set_control_points (Grob *me);
-  static void check_slope (Grob *me);
-  static Offset encompass_offset (Grob *me, Grob *col, Grob **common);
-};
-
-#endif // SLUR_HH
-
-
index 83a7e984963a8d128d7241b05743d4c609d5ad19..a18495ba91970c0a0247eff46ed2ffe004a48875 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <math.h>
 
+#include "bezier.hh"
 #include "new-slur.hh"
 #include "main.hh"
 #include "font-interface.hh"
@@ -21,8 +22,6 @@
 #include "note-column.hh"
 #include "output-def.hh"
 #include "rod.hh"
-#include "slur-bezier-bow.hh"
-#include "slur.hh"
 #include "spanner.hh"
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
index 3c63236546d9a36980a3fe308bcf91395c087caa..80698dec74942e34d8343be7f114031ca59d5e7b 100644 (file)
@@ -7,7 +7,6 @@
 */
 
 
-#include "slur.hh"
 #include "engraver.hh"
 #include "rhythmic-head.hh"
 #include "stem.hh"
diff --git a/lily/slur-bezier-bow.cc b/lily/slur-bezier-bow.cc
deleted file mode 100644 (file)
index 380435b..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-  slur-bezier-bow.cc -- implement Slur_bezier_bow
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 2000--2004  Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-#include "warn.hh"
-#include "output-def.hh"
-#include "slur-bezier-bow.hh"
-
-Slur_bezier_bow::Slur_bezier_bow (Array<Offset> encompass, Direction dir,
-                                 Real h_inf, Real r_0)
-{
-  h_inf_ = h_inf;
-  r_0_ = r_0;
-  alpha_ = 0;
-  dir_ = dir;
-  encompass_ = encompass;
-  to_canonical_form ();
-
-  Real w = encompass_.top ()[X_AXIS] - encompass_[0][X_AXIS];
-  curve_ = slur_shape (w, h_inf, r_0);
-}
-
-Bezier
-Slur_bezier_bow::get_bezier () const
-{
-  Bezier rv = curve_;
-  if (dir_ == DOWN)
-    {
-      rv.scale (1, -1);
-    }
-
-  rv.rotate (alpha_);
-  rv.translate (origin_);
-  
-  return rv;
-}
-
-void
-Slur_bezier_bow::to_canonical_form ()
-{
-  origin_ = encompass_[0];
-  translate (&encompass_, -origin_);
-
-  Offset delta = encompass_.top () - encompass_[0];
-  alpha_ = delta.arg ();
-
-  rotate (&encompass_, -alpha_);
-  if (dir_ == DOWN)
-    {
-      scale (&encompass_, 1, -1);
-    }
-
-  while (encompass_.size () > 1 && encompass_[1][X_AXIS] <= 0.0)
-    {
-      programming_error ("Degenerate bow: infinite steepness reqd");
-      encompass_.del (1);
-    }
-
-  Real l = encompass_.top ()[X_AXIS];
-  while (encompass_.size () > 1 && encompass_.top (1)[X_AXIS] >= l)
-    {
-      programming_error ("Degenerate bow: infinite steepness reqd");
-      encompass_.del (encompass_.size ()-2);
-    }
-}
-
-
-
-void
-Slur_bezier_bow::blow_fit ()
-{
-  Real len = curve_.control_[3][X_AXIS]; 
-  Real h = curve_.control_[1][Y_AXIS] * fit_factor () / len;
-  curve_.control_[1][Y_AXIS] = h * len;
-  curve_.control_[2][Y_AXIS] = h * len;  
-  curve_.assert_sanity ();
-}
-
-
-Real
-Slur_bezier_bow::get_enclosed_area () const
-{
-  Real a = 0;
-  for (int i=0; i < encompass_.size (); i++)
-    {
-      Interval x;
-      Interval y;
-      if (i == 0)
-       {
-         x = Interval (0, encompass_[1][X_AXIS] / 2);
-         y = Interval (0,
-                       curve_.get_other_coordinate (X_AXIS,
-                                                    encompass_[1][X_AXIS]
-                                                    / 2));
-       }
-      else if (i == encompass_.size () - 1)
-       {
-         x = Interval ((encompass_[i-1][X_AXIS] + encompass_[i][X_AXIS])/2, 
-                       encompass_[i][X_AXIS]);
-         y = Interval (0,
- (curve_.get_other_coordinate (X_AXIS,
- (x[MIN] + x[MAX]) / 2)));
-       }
-      else
-       {
-         x = Interval ((encompass_[i-1][X_AXIS] + encompass_[i][X_AXIS]) / 2, 
- (encompass_[i][X_AXIS] + encompass_[i+1][X_AXIS]) / 2);
-         y = Interval (encompass_[i][Y_AXIS],
- (curve_.get_other_coordinate (X_AXIS, x[MIN])
-                        + curve_.get_other_coordinate (X_AXIS,
- (x[MIN] + x[MAX]) / 2)
-                        + curve_.get_other_coordinate (X_AXIS, x[MAX])) / 3);
-       }
-      
-      Real da = x.length () * y.length ();
-      a += da;
-    }
-  return a;
-}
-
-Array<Real>
-Slur_bezier_bow::area_x_gradientses (Real area)
-{
-  Real len = curve_.control_[3][X_AXIS]; 
-  Real grow = len / 10.0;
-  Array<Real> da (2);
-  for (int i=0; i < 2; i++)
-    {
-      Real r = curve_.control_[i+1][X_AXIS];
-      curve_.control_[i+1][X_AXIS] += grow;
-      da[i] = (get_enclosed_area () - area) / grow;
-      curve_.control_[i+1][X_AXIS] = r; 
-    }
-  return da;
-}
-
-/*
-  ugh, should have another look, and use a regular optimization
-  algorithm, instead of this homebrew.
-*/
-void
-Slur_bezier_bow::minimise_enclosed_area (Real beauty,
-                                        SCM bezier_props)
-{
-  Real length = curve_.control_[3][X_AXIS]; 
-  Real beautiful = beauty * length * slur_height (length, h_inf_, r_0_);
-
-
-  if (fit_factor () > 1.0)
-    blow_fit ();
-  
-  Real pct_c0 = ly_scm2double (ly_cdr (scm_assoc (ly_symbol2scm ("bezier-pct-c0"), bezier_props)));
-  Real pct_c3 = ly_scm2double (ly_cdr (scm_assoc (ly_symbol2scm ("bezier-pct-c3"), bezier_props)));
-  Real pct_in_max =  ly_scm2double (ly_cdr (scm_assoc (ly_symbol2scm ("bezier-pct-in-max"), bezier_props)));
-  Real pct_out_max = ly_scm2double (ly_cdr (scm_assoc (ly_symbol2scm ("bezier-pct-out-max"), bezier_props)));
-  Real steps =  ly_scm2double (ly_cdr (scm_assoc (ly_symbol2scm ("bezier-area-steps"),bezier_props)));
-
-  for (int i=0; i < steps; i++)
-    {
-      Real area = get_enclosed_area ();
-      if (area <= beautiful)
-       break;
-
-      Array<Real> da = area_x_gradientses (area);
-
-      // urg
-      Real pct = pct_c0 + pct_c3 * length * length * length;
-      pct *= (steps - i) / steps;
-      if (da[0] > 0 || da[1] < 0)
-       pct = pct <? pct_out_max;
-      else
-       pct = pct <? pct_in_max;
-
-      Real u = (abs (curve_.control_[1][X_AXIS] / da[0])
-               <? abs ((curve_.control_[3][X_AXIS]
-                        - curve_.control_[2][X_AXIS]) / da[1]));
-
-      curve_.control_[1][X_AXIS] -= da[0] * u * pct;
-      curve_.control_[2][X_AXIS] -= da[1] * u * pct;
-    }
-}
-
-
-
-/*
-  max (encompass.y / curve.y)
-  
- */
-Real
-Slur_bezier_bow::fit_factor () const
-{
-  Real x1 = encompass_[0][X_AXIS];
-  Real x2 = encompass_.top ()[X_AXIS];
-
-  Real factor = 0.0;
-  for (int i=1; i < encompass_.size ()-1; i++)
-    {
-      if (encompass_[i][X_AXIS] > x1 && encompass_[i][X_AXIS] < x2)
-       {
-        Real y = curve_.get_other_coordinate (X_AXIS, encompass_[i][X_AXIS]);
-        if (y>0)
-          {
-            Real f = encompass_[i][Y_AXIS] / y;
-            factor = factor >? f;
-          }
-       }
-    }
-
-
-  return factor;
-}
-
-
-
-
index c25d5c53df7b4ccefcb1f4ccfa4a6110534a2ecf..2fd8386bd2b090b507900b7e8819e77cf32b8e32 100644 (file)
@@ -19,7 +19,7 @@
 #include "note-column.hh"
 #include "output-def.hh"
 #include "pitch.hh"
-#include "slur-bezier-bow.hh"
+#include "bezier.hh"
 #include "spanner.hh"
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
diff --git a/lily/slur.cc b/lily/slur.cc
deleted file mode 100644 (file)
index cc4090a..0000000
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
-  slur.cc -- implement Old_slur
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-    Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-/*
-  [TODO]
-  
-    * should avoid stafflines with horizontal part.
-
-    * begin and end should be treated as a/acknowledge Scripts.
-
-    * smart changing of endings
-
-    * smart changing of (Y-?)offsets to avoid ugly beziers
- (along-side-stem)
- */
-
-#include "directional-element-interface.hh"
-#include "group-interface.hh"
-#include "slur.hh"
-#include "lookup.hh"
-#include "output-def.hh"
-#include "note-column.hh"
-#include "stem.hh"
-#include "paper-column.hh"
-#include "stencil.hh"
-#include "warn.hh"
-#include "slur-bezier-bow.hh"
-#include "main.hh"
-#include "group-interface.hh"
-#include "staff-symbol-referencer.hh"
-#include "spanner.hh"
-
-
-void
-Old_slur::set_interface (Grob*me)
-{
-  /* Copy to mutable list. */
-  me->set_property ("attachment",
-                   ly_deep_copy (me->get_property ("attachment")));
-}
-
-void
-Old_slur::add_column (Grob*me, Grob*n)
-{
-  Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-columns"), n);
-  me->add_dependency (n);
-
-  add_bound_item (dynamic_cast<Spanner*> (me), dynamic_cast<Item*> (n));
-}
-
-void
-Old_slur::de_uglify (Grob*me, Slur_bezier_bow* bb, Real default_height)
-{
-  Real length = bb->curve_.control_[3][X_AXIS] ; 
-  Real ff = bb->fit_factor ();
-  for (int i = 1; i < 3; i++)
-    {
-      Real ind = abs (bb->curve_.control_[ (i-1)*3][X_AXIS]
-                     - bb->curve_.control_[i][X_AXIS]) / length;
-      Real h = bb->curve_.control_[i][Y_AXIS] * ff / length;
-
-      Real f = default_height / length;
-      SCM up = me->get_property ("de-uglify-parameters");
-      
-      Real c1 = ly_scm2double (ly_car (up));
-      Real c2 = ly_scm2double (ly_cadr (up));
-      Real c3 = ly_scm2double (ly_caddr (up)); 
-      
-      if (h > c1 * f)
-       {
-         h = c1 * f; 
-       }
-      else if (h > c2 + c3 * ind)
-       {
-         h = c2 + c3 * ind; 
-       }
-      
-      bb->curve_.control_[i][Y_AXIS] = h * length;
-    } 
-
-  bb->curve_.assert_sanity ();
-}
-
-
-
-Direction
-Old_slur::get_default_dir (Grob*me) 
-{
-  Link_array<Grob> encompasses =
-    Pointer_group_interface__extract_grobs (me, (Grob*)0, "note-columns");
-  
-  Direction d = DOWN;
-  for (int i=0; i < encompasses.size (); i ++) 
-    {
-      if (Note_column::dir (encompasses[i]) < 0) 
-       {
-         d = UP;
-         break;
-       }
-    }
-  return d;
-}
-
-
-MAKE_SCHEME_CALLBACK (Old_slur, after_line_breaking,1);
-SCM
-Old_slur::after_line_breaking (SCM smob)
-{
-  Grob *me = unsmob_grob (smob);
-  if (!scm_ilength (me->get_property ("note-columns")))
-    {
-      me->suicide ();
-      return SCM_UNSPECIFIED;
-    }
-  set_extremities (me);
-  if (!ly_c_pair_p (me->get_property ("control-points")))
-    set_control_points (me);
-  return SCM_UNSPECIFIED;
-} 
-
-
-void
-Old_slur::check_slope (Grob *me)
-{
-  /*
-    Avoid too steep slurs.
-   */
-  SCM s = me->get_property ("slope-limit");
-  if (ly_c_number_p (s))
-    {
-      Array<Offset> encompass = get_encompass_offsets (me);
-      Drul_array<Offset> attachment;
-      attachment[LEFT] = encompass[0];
-      attachment[RIGHT] = encompass.top ();
-
-      Real dx = attachment[RIGHT][X_AXIS] - attachment[LEFT][X_AXIS];
-      Real dy = attachment[RIGHT][Y_AXIS] - attachment[LEFT][Y_AXIS];
-      if (!dx)
-       return;
-      
-      Real slope = slope = abs (dy / dx);
-
-      Real limit = ly_scm2double (s);
-
-      if (slope > limit)
-       {
-         Real staff_space = Staff_symbol_referencer::staff_space ((Grob*)me);
-         Direction dir = (Direction)ly_scm2int (me->get_property ("direction"));
-         Direction d = (Direction) (- dir * (sign (dy)));
-         SCM a = me->get_property ("attachment-offset");
-         Drul_array<Offset> o;
-         o[LEFT] = ly_scm2offset (index_get_cell (a, LEFT));
-         o[RIGHT] = ly_scm2offset (index_get_cell (a, RIGHT));
-         o[d][Y_AXIS] -= (limit - slope) * dx * dir / staff_space;
-
-         o[d][Y_AXIS] *= get_grob_direction (me);
-
-         me->set_property ("attachment-offset",
-                               scm_cons (ly_offset2scm (o[LEFT]),
-                                        ly_offset2scm (o[RIGHT])));
-       }
-    }
-
-}
-
-/*
-  Set 'attachment grob property, and return it.
-*/
-SCM
-Old_slur::set_extremities (Grob *me)
-{
-  if (!get_grob_direction (me))
-    set_grob_direction (me, get_default_dir (me));
-
-  SCM att = me->get_property ("attachment");
-      /*
-       */
-      if (!ly_c_pair_p (att))
-       {
-         programming_error ("attachment is not a cons?!");
-         att = scm_cons (SCM_EOL, SCM_EOL);
-         me->set_property ("attachment", att);
-       }
-      
-  Direction dir = LEFT;
-  do 
-    {
-    
-      if (!ly_c_symbol_p (index_get_cell (att, dir)))
-       {
-         SCM p = me->get_property ("extremity-function");
-         SCM res = ly_symbol2scm ("head");
-         
-         if (ly_c_procedure_p (p))
-           res =  scm_call_2 (p, me->self_scm (), scm_int2num (dir));
-
-         if (ly_c_symbol_p (res))
-           index_set_cell (att, dir, res);
-       }
-    }
-  while (flip (&dir) != LEFT);
-
-  check_slope (me);
-
-  return att;
-}
-
-
-Real
-Old_slur::get_boundary_notecolumn_y (Grob *me, Direction dir)
-{
-  SCM cols = me->get_property ("note-columns");
-
-  if (!ly_c_pair_p (cols))
-    {
-      programming_error ("No note-columns in slur?");
-      me->suicide ();
-      return 0.0;
-    }
-  
-  if (dir == LEFT)
-    cols = scm_reverse (cols);
-  
-  Grob *col = unsmob_grob (ly_car (cols));
-  Grob *common[] =
-  {
-    0,
-    me->common_refpoint (col, Y_AXIS)
-  };
-  Real y;
-  if (col == ((Spanner*)me)->get_bound (dir))
-    {
-      y = get_attachment (me, dir, common)[Y_AXIS];
-    }
-  else
-    {
-      y = encompass_offset (me, col, common)[Y_AXIS]
-       - me->relative_coordinate (common[Y_AXIS], Y_AXIS); 
-    }
-  return y;
-}
-
-Offset
-Old_slur::broken_trend_offset (Grob *me, Direction dir)
-{
-  /*
-    A broken slur should maintain the same vertical trend
-    the unbroken slur would have had.
-  */
-  Offset o;
-  if (Spanner *mother =  dynamic_cast<Spanner*> (me->original_))
-    {
-      int k = broken_spanner_index (dynamic_cast<Spanner*> (me));
-      int j = k + dir;
-      if (j < 0 || j >= mother->broken_intos_.size ())
-       return o;
-      
-      Grob *neighbour = mother->broken_intos_[j];      
-      if (dir == RIGHT)
-       neighbour->set_property ("direction",
-                                     me->get_property ("direction"));
-      Real neighbour_y = get_boundary_notecolumn_y (neighbour, dir);
-      Real y = get_boundary_notecolumn_y (me, -dir);
-      int neighbour_cols = scm_ilength (neighbour->get_property ("note-columns"));
-      int cols = scm_ilength (me->get_property ("note-columns"));
-      o = Offset (0, (y*neighbour_cols + neighbour_y*cols) /
-                 (cols + neighbour_cols));
-    }
-  return o;
-}
-
-/*
-  COMMON is size-2 array with common refpoints.
-
-UGH: this routine delivers offsets which are *not* relative to COMMON.
-
-UGH,  we should take COMMON-Y as argument.
-*/ 
-Offset
-Old_slur::get_attachment (Grob *me, Direction dir,
-                     Grob **common) 
-{
-  SCM s = me->get_property ("attachment");
-  if (!ly_c_pair_p (s) || !ly_c_symbol_p (index_get_cell (s, dir)))
-    {
-      s = set_extremities (me);
-    }
-  
-  SCM a = (dir == LEFT) ? ly_car (s) : ly_cdr (s);
-  Spanner*sp = dynamic_cast<Spanner*> (me);
-  String str = ly_symbol2string (a);
-  
-  Real staff_space = Staff_symbol_referencer::staff_space ((Grob*)me);
-  Real hs = staff_space / 2.0;
-  Offset o;
-  
-  Direction slurdir = to_dir (me->get_property ("direction"));
-  
-  Grob *stem = 0;
-  if (Note_column::has_interface (sp->get_bound (dir)))
-    {
-      Grob * n =sp->get_bound (dir);
-      stem = Note_column::get_stem (n);
-      if (stem)
-       {
-         Real x_extent;
-         Grob *head = Note_column::first_head (n);
-         if (head)
-           x_extent = head->extent (head, X_AXIS).length ();
-         else
-           x_extent = n->extent (n, X_AXIS).length ();
-
-         if (!head)
-           {
-             o = Offset (0, n->extent (n, Y_AXIS)[slurdir]);
-           }
-         else if (str == "head")
-           {
-             o = Offset (0, Stem::head_positions (stem)
-                         [slurdir] * hs);
-             /*
-               Default position is centered in X, on outer side of head Y
-              */
-             o += Offset (0.5 * x_extent,
-                          0.5 * staff_space
-                          * slurdir);
-           }
-         else if (str == "alongside-stem")
-           {
-             o = Offset (0, Stem::chord_start_y (stem));
-             /*
-               Default position is on stem X, on outer side of head Y
-              */
-             o += Offset (x_extent * (1 + Stem::get_direction (stem)),
-                          0.5 * staff_space
-                          * slurdir);
-           }
-         else if (str == "stem")
-           {
-             o = Offset (0, Stem::stem_end_position (stem) * hs);
-             /*
-               Default position is on stem X, at stem end Y
-              */
-             Real stem_thickness = Stem::thickness (stem);
-             o += Offset (0.5 *
-                          x_extent * (1 + Stem::get_direction (stem))
-                          - ((dir + 1)/2) * stem_thickness
-                          + ((1 - slurdir)/2) * stem_thickness,
-                          0);
-           }
-       }
-    }
-  /*
-    If we're not a note_column, we can't be anything but a loose-end.
-    But if user has set (attachment . (stem . stem)), our string is
-    stem, not loose-end.
-
-    Hmm, maybe after-line-breaking should set this to loose-end?  */
-  else // if (str == "loose-end")
-    {
-      SCM other_a = dir == LEFT ? ly_cdr (s) : ly_car (s);
-      if (ly_symbol2string (other_a) != "loose-end")
-       o = broken_trend_offset (me, dir);
-    }
-
-  SCM alist = me->get_property ("extremity-offset-alist");
-  int stemdir = stem ? Stem::get_direction (stem) : 1;
-  SCM l = scm_assoc
-    (scm_list_n (a,
-                 scm_int2num (stemdir * dir),
-                 scm_int2num (slurdir * dir),
-                  SCM_UNDEFINED), alist);
-
-  if (l != SCM_BOOL_F)
-    {
-      Offset off = ly_scm2offset (ly_cdr (l)) * staff_space;
-      off[X_AXIS] *= dir;
-      off[Y_AXIS] *= slurdir;
-      o += off;
-    }
-
-  /*
-    What if get_bound () is not a note-column?
-   */
-  if (str != "loose-end"
-      && sp->get_bound (dir)->common_refpoint (common[Y_AXIS], Y_AXIS) == common[Y_AXIS])
-    {      
-      o[Y_AXIS] += sp->get_bound (dir)->relative_coordinate (common[Y_AXIS], Y_AXIS) 
-       - me->relative_coordinate (common[Y_AXIS], Y_AXIS);
-    }
-
-  Offset off = ly_scm2offset (index_get_cell (me->get_property
-                                         ("attachment-offset"),
-                                         dir)) * staff_space;
-
-  off[Y_AXIS] *= slurdir;
-  o += off;
-  return o;
-}
-
-Offset
-Old_slur::encompass_offset (Grob*me,
-                       Grob* col,
-                       Grob **common) 
-{
-  Offset o;
-  Grob* stem = unsmob_grob (col->get_property ("stem"));
-  
-  Direction dir = get_grob_direction (me);
-  
-  if (!stem)
-    {
-      programming_error ("No stem for note column?");
-      o[X_AXIS] = col->relative_coordinate (common[X_AXIS], X_AXIS);
-      o[Y_AXIS] = col->relative_coordinate (common[Y_AXIS], Y_AXIS);
-      return o;  
-    }
-  Direction stem_dir = get_grob_direction (stem);
-  o[X_AXIS] = stem->relative_coordinate (0, X_AXIS);
-
-  /*
-    Simply set x to middle of notehead
-   */
-  Real x_extent;
-  if (Grob *head = Note_column::first_head (col))
-    x_extent = head->extent (head, X_AXIS).length ();
-  else
-    x_extent = col->extent (col, X_AXIS).length ();
-  o[X_AXIS] -= 0.5 * stem_dir * x_extent;
-
-  if ((stem_dir == dir)
-      && !stem->extent (stem, Y_AXIS).is_empty ())
-    {
-      o[Y_AXIS] = stem->extent (common[Y_AXIS], Y_AXIS)[dir];
-    }
-  else
-    {
-      o[Y_AXIS] = col->extent (common[Y_AXIS], Y_AXIS)[dir];
-    }
-
-  /*
-   leave a gap: slur mustn't touch head/stem
-   */
-  o[Y_AXIS] += dir * robust_scm2double (me->get_property ("y-free"), 0) *
-    1.0;
-  return o;
-}
-
-Array<Offset>
-Old_slur::get_encompass_offsets (Grob *me)
-{
-  Spanner*sp = dynamic_cast<Spanner*> (me);
-  SCM eltlist = me->get_property ("note-columns");
-  Grob *common[] = {common_refpoint_of_list (eltlist, me, X_AXIS),
-                   common_refpoint_of_list (eltlist, me, Y_AXIS)};
-
-
-  common[X_AXIS] = common[X_AXIS]->common_refpoint (sp->get_bound (RIGHT), X_AXIS);
-  common[X_AXIS] = common[X_AXIS]->common_refpoint (sp->get_bound (LEFT), X_AXIS);
-  
-  Link_array<Grob>  encompasses = ly_scm2grobs (eltlist);
-  Array<Offset> offsets;
-
-  Offset origin (me->relative_coordinate (common[X_AXIS], X_AXIS),
-                me->relative_coordinate (common[Y_AXIS], Y_AXIS)); 
-
-  int first = 1;
-  int last = encompasses.size () - 2;
-
-  offsets.push (get_attachment (me, LEFT, common));
-
-  /*
-    left is broken edge
-  */
-  if (encompasses[0] != sp->get_bound (LEFT))
-    {
-      first--;
-
-      // ?
-      offsets[0][Y_AXIS] -=
-       encompasses[0]->relative_coordinate (common[Y_AXIS], Y_AXIS) 
-       - me->relative_coordinate (common[Y_AXIS], Y_AXIS); 
-    }
-
-  /*
-    right is broken edge
-  */
-  if (encompasses.top () != sp->get_bound (RIGHT))
-    {
-      last++;
-    }
-
-  for (int i = first; i <= last; i++)
-    {
-      Offset o (encompass_offset (me, encompasses[i], common));
-      offsets.push (o - origin);
-    }
-
-  offsets.push (Offset (sp->spanner_length (), 0) + get_attachment (me, RIGHT,common));
-
-  if (encompasses[0] != sp->get_bound (LEFT))
-    {
-      offsets.top ()[Y_AXIS] -= encompasses.top ()->relative_coordinate (common[Y_AXIS], Y_AXIS) 
-       - me->relative_coordinate (common[Y_AXIS], Y_AXIS);
-    }
-
-  return offsets;
-}
-
-
-
-
-/*
-  ugh ?
- */
-MAKE_SCHEME_CALLBACK (Old_slur, height, 2);
-SCM
-Old_slur::height (SCM smob, SCM ax)
-{
-  Axis a = (Axis)ly_scm2int (ax);
-  Grob * me = unsmob_grob (smob);
-  assert (a == Y_AXIS);
-
-  SCM mol = me->get_uncached_stencil ();
-  Interval ext;
-  if (Stencil * m = unsmob_stencil (mol))
-    ext = m->extent (a);
-  return ly_interval2scm (ext);
-}
-
-/*
-  Ugh should have dash-length + dash-period
- */
-MAKE_SCHEME_CALLBACK (Old_slur, print,1);
-SCM
-Old_slur::print (SCM smob)
-{
-  Grob * me = unsmob_grob (smob);
-  if (!scm_ilength (me->get_property ("note-columns")))
-    {
-      me->suicide ();
-      return SCM_EOL;
-    }
-
-  Real base_thick = robust_scm2double (me->get_property ("thickness"), 1);
-  Real thick = base_thick * Staff_symbol_referencer::line_thickness (me);
-
-  Real ss = Staff_symbol_referencer::staff_space (me);
-  Bezier one = get_curve (me);
-
-  // get_curve may suicide
-  if (!scm_ilength (me->get_property ("note-columns")))
-    return SCM_EOL;
-
-  Stencil a;
-
-  /*
-    TODO: replace dashed with generic property.
-   */
-  SCM d =  me->get_property ("dashed");
-  if (ly_c_number_p (d))
-    a = Lookup::dashed_slur (one, thick, thick * robust_scm2double (d, 0));
-  else
-    a = Lookup::slur (one, get_grob_direction (me) * base_thick * ss / 10.0,
-                     thick);
-
-  return a.smobbed_copy ();
-}
-
-void
-Old_slur::set_control_points (Grob*me)
-{
-  Real staff_space = Staff_symbol_referencer::staff_space ((Grob*)me);
-
-  SCM details = me->get_property ("details");
-  SCM h_inf_scm = me->get_property ("height-limit");
-  SCM r_0_scm = me->get_property ("ratio");
-
-  Real r_0 = robust_scm2double (r_0_scm, 1);
-  Real h_inf = staff_space * ly_scm2double (h_inf_scm);
-  
-  Slur_bezier_bow bb (get_encompass_offsets (me),
-                     get_grob_direction (me),
-                     h_inf, r_0);
-
-
-  if (bb.fit_factor () > 1.0)
-    {
-      Real length = bb.curve_.control_[3][X_AXIS]; 
-      Real default_height = slur_height (length, h_inf, r_0);
-
-      SCM ssb = me->get_property ("beautiful");
-      Real sb = 0;
-      if (ly_c_number_p (ssb))
-       sb = ly_scm2double (ssb);
-
-      bb.minimise_enclosed_area (sb, details);
-      SCM sbf = scm_assq (ly_symbol2scm ("force-blowfit"), details);
-      Real bff = 1.0;
-      if (ly_c_pair_p (sbf) && ly_c_number_p (ly_cdr (sbf)))
-         bff = ly_scm2double (ly_cdr (sbf));
-
-      bb.curve_.control_[1][Y_AXIS] *= bff;
-      bb.curve_.control_[2][Y_AXIS] *= bff;
-      bb.blow_fit ();
-
-      
-      Real beautiful = length * default_height * sb;
-      Real area = bb.get_enclosed_area ();
-      
-      /*
-       Slurs that fit beautifully are not ugly
-      */
-      if (area > beautiful)
-       de_uglify (me, &bb, default_height);
-    }
-
-  Bezier b = bb.get_bezier ();
-
-
-  SCM controls = SCM_EOL;
-  for (int i= 4; i--;)
-    {
-      controls = scm_cons (ly_offset2scm (b.control_[i]), controls);
-      /*
-       BRRR WHURG.
-       All these null control-points, where do they all come from?
-      */
-      if (i && b.control_[i][X_AXIS] == 0)
-       {
-         me->suicide ();
-         return;
-       }
-    }
-
-  me->set_property ("control-points", controls);
-}
-  
-Bezier
-Old_slur::get_curve (Grob*me) 
-{
-  Bezier b;
-  int i = 0;
-
-  SCM attach = me->get_property ("attachment");
-  if (!ly_c_pair_p (attach))
-    attach = set_extremities (me);
-
-  
-  if (!get_grob_direction (me)
-      || ! ly_c_symbol_p (index_get_cell (attach, LEFT))
-      || ! ly_c_symbol_p (index_get_cell (attach, RIGHT)))
-    set_extremities (me);
-  
-  if (!ly_c_pair_p (me->get_property ("control-points")))
-    set_control_points (me);
-
-  // set_control_points may suicide
-  if (!scm_ilength (me->get_property ("note-columns")))
-    return b;
-
-  for (SCM s= me->get_property ("control-points"); s != SCM_EOL; s = ly_cdr (s))
-    {
-      b.control_[i] = ly_scm2offset (ly_car (s));
-      i++;
-    }
-
-  Array<Offset> enc (get_encompass_offsets (me));
-  Direction dir = get_grob_direction (me);
-  
-  Real x1 = enc[0][X_AXIS];
-  Real x2 = enc.top ()[X_AXIS];
-
-  Real off = 0.0;
-  for (int i=1; i < enc.size ()-1; i++)
-    {
-      Real x = enc[i][X_AXIS];
-      if (x > x1 && x <x2)
-       {
-         Real y = b.get_other_coordinate (X_AXIS, x);
-         off = off >? dir * (enc[i][Y_AXIS] - y);
-       }
-    }
-  b.translate (Offset (0, dir * off));
-  return b;
-}
-
-
-
-
-ADD_INTERFACE (Old_slur,"slur-interface",
-  "A slur",
-  "attachment attachment-offset beautiful control-points dashed details de-uglify-parameters direction extremity-function extremity-offset-alist height-limit note-columns ratio slope-limit thickness y-free quant-score");
-
index c13f97f3540f42d454f6036039e7bd2cbe772f28..2690f4920bae7b013de630836946ae396c553ffc 100644 (file)
@@ -19,7 +19,7 @@
 #include "staff-symbol-referencer.hh"
 #include "directional-element-interface.hh"
 #include "stencil.hh"
-#include "bezier-bow.hh"
+#include "bezier.hh"
 #include "stem.hh"
 #include "note-head.hh"
 #include "tie-column.hh"
index 2bdd8dceeacb5a310d850606e720d075bc92373d..83b2ae016f335ecb78eb992865480c99e8458403 100644 (file)
@@ -51,17 +51,7 @@ called first.  The functions take a grob and axis argument. ")
      (arch-width ,ly:dimension? "Width of the hook of a system brace.")
      (arpeggio-direction ,ly:dir? "If set, put an
 arrow on the arpeggio squiggly line.")
-     (attachment ,pair? "Pair of symbols
-indicating how a slur should be attached at the ends. The format is
-'(@var{left-type} . @var{right-type}), where both @var{type}s are
-symbols. The values of these symbols may be @code{alongside-stem},
-@code{stem}, @code{head} or @code{loose-end}.")
-     (attachment-offset ,pair? "cons of offsets,
-'(@var{left-offset} . @var{right-offset}).  This offset is added to
-the attachments to prevent ugly slurs.  [fixme: we need more
-documentation here].")
-
-
+  
      (auto-knee-gap ,ly:dimension? "If a gap is found between note heads
 where a  horizontal beam fits that is larger than this number,  make a kneed beam.")
      (axes ,list? "list of axis numbers.
@@ -101,7 +91,6 @@ note etc. This information is used to determine how to connect the
 beaming patterns from stem to stem inside a beam.")
 
 
-     (beautiful ,number? "number that dictates when a slur should be de-uglyfied.  It correlates with the enclosed area between noteheads and slurs.  A value of 0.1 yields only undisturbed slurs, a value of 5 will tolerate quite high blown slurs.")
      (before-line-breaking-callback ,procedure? "This procedure is
 called before line breaking, but after splitting breakable items at
 potential line breaks.")
@@ -197,7 +186,7 @@ the vertical edges '(@var{left-height} . @var{right-height}).")
 edges '(@var{left-text} . @var{right-text}).")
      (excentricity ,number? "How asymmetrical to make a slur. Positive means move the center to the right.")
      
-(expand-limit ,integer? "maximum number of measures expanded in church rests.")
+     (expand-limit ,integer? "maximum number of measures expanded in church rests.")
 
      ;; remove me? 
      (extra-X-extent ,number-pair? "A grob is enlarged in X dimension
@@ -211,16 +200,6 @@ by this much.")
 offset is added just before outputting the symbol, so the typesetting
 engine is completely oblivious to it.")
 
-      ;; docme.
-     (extremity-offset-alist ,list? "The offset adds to the centre of
-the note head, or stem.
-
-Format: alist (attachment stem-dir*dir slur-dir*dir) -> offset.
-")
-
-     ;;
-     (extremity-function ,procedure? "A function that calculates the
-attachment of  a slur-end. The function takes a slur and direction argument and returns a symbol.")  
      (finger-code ,symbol? "Code for the type of fingering indication in a
 fret diagram.  Options include @code{none}, @code{in-dot}, and @code{below-string}.")
      (flag-style ,symbol?
@@ -416,8 +395,6 @@ note that starts here.")
 object.")
      (size ,number? "Size of object, relative to standard size.")
      (slope ,number? "The slope of this object.")
-     (slope-limit ,number? "Set slope to zero if slope is running away
-steeper than this.")
      (slur-details ,list?
                   "An alist of scoring parameters for slur formatting")
      (space-alist ,list? "A table that specifies distances between
@@ -444,12 +421,6 @@ staff spaces, counted from the middle line.")
      (staffline-clearance ,ly:dimension? "How far away ties keep from
 staff lines.")
 
-     (stem-attachment-function ,procedure? "A function that calculates
-where a stem attaches to the note head? This is a fallback when this
-information is not specified in the font.  The function takes a grob
-and axis argument, and returns a (@var{x} . @var{y}) pair, specifying
-location in terms of note head bounding box.")
-
      (stem-end-position ,number? "Where does the stem end (the end is opposite to the support-head.")
 
      (stem-shorten ,list? "How much a stem in a forced direction
@@ -503,8 +474,6 @@ happen?")
 words in texts.")
      (width ,ly:dimension? "The width of a grob measured in staff space.")
      (x-gap ,ly:dimension? "The horizontal gap between note head and tie.")
-     (y-free ,ly:dimension? "The minimal vertical gap between slur and
-note heads or stems.")
      (y-offset ,ly:dimension? "Extra vertical offset for ties away
 from the center line.")
      (zigzag-length ,ly:dimension? "The length of the lines of a
@@ -629,9 +598,6 @@ functions set spanner positions.")
      ;; [TODO: change this]
      (primitive ,integer? "Pointer to a ligature primitive, i.e. an item similar to a note head that is part of a ligature. ")
      (stencil ,ly:stencil? "Cached output of the print-function.")
-     (de-uglify-parameters ,list? "list of 3 real constants. They
-define the valid areas for the middle control points.  They are
-empirical.")
      (ideal-distances ,list? "(@var{obj} . (@var{dist} . @var{strength})) pairs.")
      (minimum-distances ,list? "list of rods, that have the format (@var{obj} . @var{dist}).")
 
index 933261c0a2bbac41799a051886dae7224f97ab65..54bc8241b758c3cbcdc6c692ad83f1238e2c0cf5 100644 (file)
        ;; sadly possibly breaking patterns with high order beams.
        (beamed-stem-shorten . (1.0 0.5 0.25))
        
-       (slope-limit . 0.2)
        (flag-width-function . ,beam-flag-width-function)
        (damping . 1)
        (auto-knee-gap . 5.5)