X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Flookup.cc;h=671c0da04e38e93c0e12f418f79bc9db92e9bcbd;hb=cfc4cbf34569db6a6c8968694f86e36b206a9d05;hp=4cef41f0616a44a85adaf238d18aa15127220eb9;hpb=0387f04497978e37b335a8b99eec905499d6ad0f;p=lilypond.git diff --git a/lily/lookup.cc b/lily/lookup.cc index 4cef41f061..671c0da04e 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2008 Han-Wen Nienhuys + (c) 1997--2009 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -86,28 +86,6 @@ Lookup::beam (Real slope, Real width, Real thick, Real blot) return Stencil (b, expr); } -Stencil -Lookup::dashed_slur (Bezier b, Real thick, Real dash_period, Real dash_fraction) -{ - SCM l = SCM_EOL; - - Real on = dash_fraction * dash_period; - Real off = dash_period - on; - - for (int i = 4; i--;) - l = scm_cons (ly_offset2scm (b.control_[i]), l); - - SCM at = (scm_list_n (ly_symbol2scm ("dashed-slur"), - scm_from_double (thick), - scm_from_double (on), - scm_from_double (off), - ly_quote_scm (l), - SCM_UNDEFINED)); - - Box box (b.extent (X_AXIS), b.extent (Y_AXIS)); - return Stencil (box, at); -} - Stencil Lookup::rotated_box (Real slope, Real width, Real thick, Real blot) { @@ -365,47 +343,75 @@ Lookup::frame (Box b, Real thick, Real blot) Make a smooth curve along the points */ Stencil -Lookup::slur (Bezier curve, Real curvethick, Real linethick) +Lookup::slur (Bezier curve, Real curvethick, Real linethick, + SCM dash_details) { + Stencil return_value; + + /* + calculate the offset for the two beziers that make the sandwich + for the slur + */ Real alpha = (curve.control_[3] - curve.control_[0]).arg (); Bezier back = curve; Offset perp = curvethick * complex_exp (Offset (0, alpha + M_PI / 2)) * 0.5; - back.reverse (); back.control_[1] += perp; back.control_[2] += perp; curve.control_[1] -= perp; curve.control_[2] -= perp; - - SCM scontrols[8]; - - for (int i = 0; i < 4; i++) - scontrols[i] = ly_offset2scm (back.control_[i]); - for (int i = 0; i < 4; i++) - scontrols[i + 4] = ly_offset2scm (curve.control_[i]); - - /* - Need the weird order b.o. the way PS want its arguments - */ - int indices[] = {5, 6, 7, 4, 1, 2, 3, 0}; - SCM list = SCM_EOL; - for (int i = 8; i--;) - list = scm_cons (scontrols[indices[i]], list); - - SCM at = (scm_list_n (ly_symbol2scm ("bezier-sandwich"), - ly_quote_scm (list), - scm_from_double (linethick), - SCM_UNDEFINED)); - Box b (curve.extent (X_AXIS), - curve.extent (Y_AXIS)); - - b[X_AXIS].unite (back.extent (X_AXIS)); - b[Y_AXIS].unite (back.extent (Y_AXIS)); - - b.widen (0.5 * linethick, 0.5 * linethick); - return Stencil (b, at); + + if (!scm_is_pair (dash_details)) + { + /* solid slur */ + return_value = bezier_sandwich (back, curve, linethick); + } + else + { + /* dashed or combination slur */ + int num_segments = scm_to_int (scm_length (dash_details)); + for (int i=0; i