/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2012 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1997--2015 Jan Nieuwenhuizen <janneke@gnu.org>
Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
{
Spanner *me = dynamic_cast<Spanner *> (me_grob);
Item *g = me->get_bound (hdir);
- if (Note_column::has_interface (g)
+ if (has_interface<Note_column> (g)
&& Note_column::get_stem (g)
&& Note_column::dir (g) == my_dir)
g = Note_column::get_stem (g);
{
Drul_array<Real> zero (0, 0);
Drul_array<Real> pair
- = robust_scm2drul (me->internal_get_property (sym), zero);
+ = robust_scm2drul (me->get_property (sym), zero);
pair[xdir] = 0.0;
me->set_property (sym, ly_interval2scm (pair));
{
Spanner *me = dynamic_cast<Spanner *> (me_grob);
- if (me->get_bound (LEFT)->break_status_dir ()
- || me->get_bound (RIGHT)->break_status_dir ())
+ Item *left = me->get_bound (LEFT);
+ Item *right = me->get_bound (RIGHT);
+ if (!left || left->break_status_dir ()
+ || !right || right->break_status_dir ())
return 0;
Drul_array<Grob *> stems (Note_column::get_stem (cols[0]),
SCM
Tuplet_bracket::calc_connect_to_neighbors (SCM smob)
{
- Spanner *me = unsmob_spanner (smob);
+ Spanner *me = unsmob<Spanner> (smob);
Direction dir = get_grob_direction (me);
Drul_array<Item *> bounds (get_x_bound_item (me, LEFT, dir),
SCM
Tuplet_bracket::calc_x_positions (SCM smob)
{
- Spanner *me = unsmob_spanner (smob);
+ Spanner *me = unsmob<Spanner> (smob);
extract_grob_set (me, "note-columns", columns);
Grob *commonx = get_common_x (me);
Interval x_span;
for (LEFT_and_RIGHT (d))
{
- x_span[d] = bounds[d]->break_status_dir ()
- ? Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[d]
- : robust_relative_extent (bounds[d], commonx, X_AXIS)[d];
+ x_span[d] = Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[d];
+
if (connect_to_other[d])
{
Interval overshoot (robust_scm2drul (me->get_property ("break-overshoot"),
SCM
Tuplet_bracket::print (SCM smob)
{
- Spanner *me = unsmob_spanner (smob);
+ Spanner *me = unsmob<Spanner> (smob);
Stencil mol;
extract_grob_set (me, "note-columns", columns);
*/
SCM bracket_vis_prop = me->get_property ("bracket-visibility");
bool bracket_prop = ly_scm2bool (bracket_vis_prop); // Flag, user has set bracket-visibility prop.
- bool bracket = (bracket_vis_prop == ly_symbol2scm ("if-no-beam"));
+ bool bracket = scm_is_eq (bracket_vis_prop, ly_symbol2scm ("if-no-beam"));
if (scm_is_bool (bracket_vis_prop))
bracket_visibility = bracket_prop;
else if (bracket)
Output_def *pap = me->layout ();
- Grob *number_grob = unsmob_grob (me->get_object ("tuplet-number"));
+ Grob *number_grob = unsmob<Grob> (me->get_object ("tuplet-number"));
/*
Don't print the bracket when it would be smaller than the number.
= Text_interface::interpret_markup (pap->self_scm (),
properties, text);
- Stencil *edge_text = unsmob_stencil (t);
+ Stencil *edge_text = unsmob<Stencil> (t);
edge_text->translate_axis (x_span[d] - x_span[LEFT],
X_AXIS);
edge_stencils[d] = *edge_text;
}
Stencil m;
- for (LEFT_and_RIGHT (d))
- {
- if (!gap.is_empty ())
- m.add_stencil (Line_interface::line (me, straight_corners[d],
- gap_corners[d]));
-
+ if (!gap.is_empty ())
+ for (LEFT_and_RIGHT (d))
m.add_stencil (Line_interface::line (me, straight_corners[d],
- flare_corners[d]));
- }
-
- if (gap.is_empty ())
+ gap_corners[d]));
+ else
m.add_stencil (Line_interface::line (me, straight_corners[LEFT],
straight_corners[RIGHT]));
+ if (scm_is_number (me->get_property ("dash-fraction")))
+ me->set_property ("dash-fraction", scm_from_double (1.0));
+ for (LEFT_and_RIGHT (d))
+ m.add_stencil (Line_interface::line (me, straight_corners[d],
+ flare_corners[d]));
return m;
}
Real x1 = robust_relative_extent (rgr, commonx, X_AXIS)[RIGHT];
bool follow_beam = par_beam
&& get_grob_direction (par_beam) == dir
- && !to_boolean (par_beam->get_property ("knee"));
+ && !Beam::is_knee (par_beam);
vector<Offset> points;
if (columns.size ()
}
// Check for number-on-bracket collisions
- Grob *number = unsmob_grob (tuplets[i]->get_object ("tuplet-number"));
+ Grob *number = unsmob<Grob> (tuplets[i]->get_object ("tuplet-number"));
if (number)
- points.push_back (Offset (number->extent (commonx, X_AXIS).center () - x0,
- number->extent (commony, Y_AXIS)[dir]));
+ {
+ Interval x_ext = robust_relative_extent (number, commonx, X_AXIS);
+ Interval y_ext = robust_relative_extent (number, commony, Y_AXIS);
+ points.push_back (Offset (x_ext.center () - x0, y_ext[dir]));
+ }
}
if (to_boolean (me->get_property ("avoid-scripts"))
// assume that if a script is avoiding slurs, it should not get placed
// under a tuplet bracket
- SCM avoid = scripts[i]->get_property ("avoid-slur");
- if (unsmob_grob (scripts[i]->get_object ("slur"))
- && (avoid == ly_symbol2scm ("outside")
- || avoid == ly_symbol2scm ("around")))
+ if (unsmob<Grob> (scripts[i]->get_object ("slur")))
continue;
- Interval script_x (scripts[i]->extent (commonx, X_AXIS));
- Interval script_y (scripts[i]->extent (commony, Y_AXIS));
+ Interval script_x
+ = robust_relative_extent (scripts[i], commonx, X_AXIS);
+ Interval script_y
+ = robust_relative_extent (scripts[i], commony, Y_AXIS);
points.push_back (Offset (script_x.center () - x0,
script_y[dir]));
/*
horizontal brackets should not collide with staff lines.
- Kind of pointless since we put them outside the staff anyway, but
- let's leave code for the future when possibly allow them to move
- into the staff once again.
-
This doesn't seem to support cross-staff tuplets atm.
*/
- if (*dy == 0
- && fabs (*offset) < ss * Staff_symbol_referencer::staff_radius (me))
+ if (*dy == 0)
{
// quantize, then do collision check.
- *offset *= 2 / ss;
+ *offset /= 0.5 * ss;
- *offset = rint (*offset);
- if (Staff_symbol_referencer::on_line (me, (int) rint (*offset)))
- *offset += dir;
+ Interval staff_span = Staff_symbol_referencer::staff_span (me);
+ if (staff_span.contains (*offset))
+ {
+ *offset = rint (*offset);
+ if (Staff_symbol_referencer::on_line (me, int (*offset)))
+ *offset += dir;
+ }
*offset *= 0.5 * ss;
}
SCM
Tuplet_bracket::calc_direction (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
Direction dir = Tuplet_bracket::get_default_dir (me);
return scm_from_int (dir);
}
SCM
Tuplet_bracket::calc_positions (SCM smob)
{
- Spanner *me = unsmob_spanner (smob);
+ Spanner *me = unsmob<Spanner> (smob);
Real dy = 0.0;
Real offset = 0.0;
SCM
Tuplet_bracket::calc_cross_staff (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
extract_grob_set (me, "note-columns", cols);
extract_grob_set (me, "tuplets", tuplets);
for (vsize i = 0; i < cols.size (); i++)
{
- Grob *stem = unsmob_grob (cols[i]->get_object ("stem"));
+ Grob *stem = unsmob<Grob> (cols[i]->get_object ("stem"));
if (stem && to_boolean (stem->get_property ("cross-staff")))
return SCM_BOOL_T;
}
"note-columns "
"padding "
"tuplet-number "
+ "scripts "
"shorten-pair "
"staff-padding "
"thickness "