#include "bezier.hh"
#include "directional-element-interface.hh"
#include "font-interface.hh"
+#include "item.hh"
#include "pointer-group-interface.hh"
#include "lookup.hh"
#include "main.hh" // DEBUG_SLUR_SCORING
: ly_interval2scm (Interval ());
}
-/*
- Ugh should have dash-length + dash-period
-*/
MAKE_SCHEME_CALLBACK (Slur, print, 1);
SCM
Slur::print (SCM smob)
Bezier one = get_curve (me);
Stencil a;
- /*
- TODO: replace dashed with generic property.
- */
SCM p = me->get_property ("dash-period");
SCM f = me->get_property ("dash-fraction");
if (scm_is_number (p) && scm_is_number (f))
line_thick);
#if DEBUG_SLUR_SCORING
- SCM quant_score = me->get_property ("quant-score");
-
- if (to_boolean (me->layout ()
- ->lookup_variable (ly_symbol2scm ("debug-slur-scoring")))
- && scm_is_string (quant_score))
+ SCM annotation = me->get_property ("annotation");
+ if (!scm_is_string (annotation))
+ {
+ SCM debug = me->layout ()->lookup_variable (ly_symbol2scm ("debug-slur-scoring"));
+ if (to_boolean (debug))
+ annotation = me->get_property ("quant-score");
+ }
+
+ if (scm_is_string (annotation))
{
string str;
SCM properties = Font_interface::text_font_alist_chain (me);
-
if (!scm_is_number (me->get_property ("font-size")))
properties = scm_cons (scm_acons (ly_symbol2scm ("font-size"), scm_from_int (-6), SCM_EOL),
properties);
Stencil tm = *unsmob_stencil (Text_interface::interpret_markup
(me->layout ()->self_scm (), properties,
- quant_score));
+ annotation));
a.add_at_edge (Y_AXIS, get_grob_direction (me), tm, 1.0);
}
#endif
{
extract_grob_set (g, "elements", breakables);
for (vsize j = 0; j < breakables.size (); j++)
- if (breakables[j]->get_property ("avoid-slur") == ly_symbol2scm ("inside"))
+ /* if we encompass a separation-item that spans multiple staves,
+ we filter out the grobs that don't belong to our staff */
+ if (me->common_refpoint (breakables[j], Y_AXIS) == me->get_parent (Y_AXIS)
+ && breakables[j]->get_property ("avoid-slur") == ly_symbol2scm ("inside"))
new_encompasses.push_back (breakables[j]);
}
else
Slur::calc_cross_staff (SCM smob)
{
Grob *me = unsmob_grob (smob);
- Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
- assert (staff); // delete me
+
extract_grob_set (me, "note-columns", cols);
+ extract_grob_set (me, "encompass-objects", extras);
for (vsize i = 0; i < cols.size (); i++)
- if (Staff_symbol_referencer::get_staff_symbol (cols[i]) != staff)
- return SCM_BOOL_T;
- return SCM_BOOL_F;
+ {
+ if (Grob *s = Note_column::get_stem (cols[i]))
+ if (to_boolean (s->get_property ("cross-staff")))
+ return SCM_BOOL_T;
+ }
+
+ /* the separation items are dealt with in replace_breakable_encompass_objects
+ so we can ignore them here */
+ vector<Grob*> non_sep_extras;
+ for (vsize i = 0; i < extras.size (); i++)
+ if (!Separation_item::has_interface (extras[i]))
+ non_sep_extras.push_back (extras[i]);
+
+ Grob *common = common_refpoint_of_array (cols, me, Y_AXIS);
+ common = common_refpoint_of_array (non_sep_extras, common, Y_AXIS);
+
+ return scm_from_bool (common != me->get_parent (Y_AXIS));
}
ADD_INTERFACE (Slur,
"A slur",
/* properties */
+ "annotation "
"avoid-slur " /* UGH. */
"control-points "
"dash-fraction "