X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur.cc;h=cde26695784ce002592e4a4630ece622ab41c044;hb=04c1b33f379f90e1915804c0a570a5fec3f660d2;hp=83c181efe2992c7eee82d5a2c05ddc0bbd189cd1;hpb=a2cd820fd0beb21a9abc132e1c11b09623683114;p=lilypond.git diff --git a/lily/slur.cc b/lily/slur.cc index 83c181efe2..cde2669578 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -17,7 +17,7 @@ #include "group-interface.hh" #include "lily-guile.hh" #include "lookup.hh" -#include "main.hh" +#include "main.hh" // DEBUG_SLUR_SCORING #include "note-column.hh" #include "output-def.hh" #include "rod.hh" @@ -29,6 +29,7 @@ #include "stencil.hh" #include "text-item.hh" #include "warn.hh" +#include "slur-scoring.hh" MAKE_SCHEME_CALLBACK (Slur, height, 2); SCM @@ -77,18 +78,18 @@ Slur::print (SCM smob) a = Lookup::slur (one, get_grob_direction (me) * base_thick * ss / 10.0, thick); -#if DEBUG_SLUR_QUANTING +#if DEBUG_SLUR_SCORING SCM quant_score = me->get_property ("quant-score"); - if (to_boolean (me->get_paper () + if (to_boolean (me->get_layout () ->lookup_variable (ly_symbol2scm ("debug-slur-scoring"))) && scm_is_string (quant_score)) { String str; SCM properties = Font_interface::text_font_alist_chain (me); - Stencil tm = *unsmob_stencil (Text_item::interpret_markup - (me->get_paper ()->self_scm (), properties, + Stencil tm = *unsmob_stencil (Text_interface::interpret_markup + (me->get_layout ()->self_scm (), properties, quant_score)); a.add_at_edge (Y_AXIS, get_grob_direction (me), tm, 1.0, 0); } @@ -104,8 +105,8 @@ Slur::get_curve (Grob*me) Bezier b; int i = 0; for (SCM s = me->get_property ("control-points"); s != SCM_EOL; - s = ly_cdr (s)) - b.control_[i++] = ly_scm2offset (ly_car (s)); + s = scm_cdr (s)) + b.control_[i++] = ly_scm2offset (scm_car (s)); return b; } @@ -151,36 +152,95 @@ Slur::outside_slur_callback (SCM grob, SCM axis) Interval xext = robust_relative_extent (script, cx, X_AXIS); - Real slur_padding = robust_scm2double (script->get_property ("padding"), - 0.2); // todo: slur property, script property? + Real slur_padding = robust_scm2double (script->get_property ("slur-padding"), + 0.0); // todo: slur property, script property? yext.widen (slur_padding); + Real EPS = 1e-3; Interval bezext (curve.control_[0][X_AXIS], curve.control_[3][X_AXIS]); - Real x = xext.center (); - if (bezext.contains (x)) - ; - else if (!bezext.contains (xext[RIGHT])) - x = xext[LEFT]; - else if (!bezext.contains (xext[LEFT])) - x = xext[RIGHT]; + bool consider[] = { false, false, false }; + Real ys[] = {0, 0, 0}; + int k = 0; + bool do_shift = false; + for (int d = LEFT; d <= RIGHT; d++) + { + Real x = xext.linear_combination ((Direction) d); + consider[k] = bezext.contains (x); + + if (consider[k]) + { + ys[k] + = (fabs(bezext[LEFT] - x) < EPS) + ? curve.control_[0][Y_AXIS] + : ((fabs(bezext[RIGHT] - x) < EPS) + ? curve.control_[3][Y_AXIS] + : curve.get_other_coordinate (X_AXIS, x)); + consider[k] = true; + + if (yext.contains (ys[k])) + do_shift = true; + } + } + Real offset = 0.0; + if (do_shift) + { + k = 0; + Direction dir = get_grob_direction (script); + for (int d = LEFT; d <= RIGHT; d++) + { + offset = dir * (dir * offset >? dir + * (ys[k] - yext[-dir] + dir * slur_padding)); + k++; + } + } - if (!bezext.contains (x)) - return scm_make_real (0); + return scm_make_real (offset); +} - Real y = curve.get_other_coordinate (X_AXIS, x); - if (yext.contains (y)) +static Direction +get_default_dir (Grob*me) +{ + Link_array encompasses + = Pointer_group_interface__extract_grobs (me, (Grob*) 0, "note-columns"); + + Direction d = DOWN; + for (int i= 0; i < encompasses.size (); i ++) { - Direction dir = get_grob_direction (script); - return scm_make_real (y - yext[-dir] + dir * slur_padding); + if (Note_column::dir (encompasses[i]) < 0) + { + d = UP; + break; + } } - return scm_make_real (0.0); + return d; } +MAKE_SCHEME_CALLBACK (Slur, after_line_breaking,1); +SCM +Slur::after_line_breaking (SCM smob) +{ + Spanner *me = dynamic_cast (unsmob_grob (smob)); + if (!scm_ilength (me->get_property ("note-columns"))) + { + me->suicide (); + return SCM_UNSPECIFIED; + } + + if (!get_grob_direction (me)) + set_grob_direction (me, get_default_dir (me)); + + if (scm_ilength (me->get_property ("control-points")) < 4) + set_slur_control_points (me); + + return SCM_UNSPECIFIED; +} + ADD_INTERFACE (Slur, "slur-interface", "A slur", "quant-score excentricity encompass-objects control-points dashed slur-details direction height-limit note-columns ratio thickness"); +