return ly_interval2scm (r - my_coord);
}
+/* This is like generic_group_extent, but it only counts the grobs that
+ are children of some other axis-group. This is uncached; if it becomes
+ commonly used, it may be necessary to cache it somehow. */
+Interval
+Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staff, Axis parent_a)
+{
+ extract_grob_set (me, "elements", elts);
+ vector<Grob*> new_elts;
+
+ for (vsize i = 0; i < elts.size (); i++)
+ if (elts[i]->common_refpoint (staff, parent_a) == staff)
+ new_elts.push_back (elts[i]);
+
+ return relative_group_extent (new_elts, refp, ext_a);
+}
+
Grob *
Axis_group_interface::calc_pure_elts_and_common (Grob *me)
#include "tie-formatting-problem.hh"
+#include "axis-group-interface.hh"
#include "paper-column.hh"
#include "bezier.hh"
#include "directional-element-interface.hh"
Tie_formatting_problem::Tie_formatting_problem ()
{
x_refpoint_ = 0;
+ y_refpoint_ = 0;
use_horizontal_spacing_ = true;
}
chord_outlines_[key] = Skyline (boxes, details_.skyline_padding_, Y_AXIS, -dir);
if (bounds[0]->break_status_dir ())
{
- Real x = robust_relative_extent (bounds[0], x_refpoint_, X_AXIS)[-dir];
-
- chord_outlines_[key].set_minimum_height (x);
+ Interval iv (Axis_group_interface::staff_extent (bounds[0], x_refpoint_, X_AXIS, y_refpoint_, Y_AXIS));
+ if (iv.is_empty ())
+ iv.add_point (bounds[0]->relative_coordinate (x_refpoint_, X_AXIS));
+
+ chord_outlines_[key].set_minimum_height (iv[-dir]);
}
else
{
return;
x_refpoint_ = ties[0];
+ y_refpoint_ = ties[0];
for (vsize i = 0; i < ties.size (); i++)
{
- x_refpoint_ = dynamic_cast<Spanner*> (ties[i])->get_bound (LEFT)->common_refpoint (x_refpoint_, X_AXIS);
- x_refpoint_ = dynamic_cast<Spanner*> (ties[i])->get_bound (RIGHT)->common_refpoint (x_refpoint_, X_AXIS);
+ Spanner *tie = dynamic_cast<Spanner*> (ties[i]);
+ Item *l = tie->get_bound (LEFT);
+ Item *r = tie->get_bound (RIGHT);
+
+ x_refpoint_ = l->common_refpoint (x_refpoint_, X_AXIS);
+ x_refpoint_ = r->common_refpoint (x_refpoint_, X_AXIS);
+
+ if (!l->break_status_dir ())
+ y_refpoint_ = l->common_refpoint (y_refpoint_, Y_AXIS);
+ if (!r->break_status_dir ())
+ y_refpoint_ = r->common_refpoint (y_refpoint_, Y_AXIS);
}
details_.from_grob (ties[0]);
specifications_.push_back (spec);
}
- x_refpoint_ = semi_ties [0];
+ x_refpoint_ = semi_ties[0];
+ y_refpoint_ = semi_ties[0];
+
for (vsize i = 0; i < semi_ties.size (); i++)
- x_refpoint_ = semi_ties[i]->common_refpoint (x_refpoint_, X_AXIS);
+ {
+ x_refpoint_ = semi_ties[i]->common_refpoint (x_refpoint_, X_AXIS);
+ y_refpoint_ = semi_ties[i]->common_refpoint (y_refpoint_, Y_AXIS);
+ }
for (vsize i = 0; i < heads.size (); i++)
- x_refpoint_ = heads[i]->common_refpoint (x_refpoint_, X_AXIS);
+ {
+ x_refpoint_ = heads[i]->common_refpoint (x_refpoint_, X_AXIS);
+ y_refpoint_ = heads[i]->common_refpoint (y_refpoint_, Y_AXIS) ;
+ }
set_chord_outline (heads, head_dir);