Axis_group_interface::generic_group_extent (Grob *me, Axis a)
{
extract_grob_set (me, "elements", elts);
- if (a == Y_AXIS)
+ if (a == Y_AXIS && to_boolean (me->get_property ("skyline-spacing")))
skyline_spacing (me, elts);
Grob *common = common_refpoint_of_array (elts, me, a);
vsize i = 0;
vector<Box> boxes;
+
for (i = 0; i < elements.size ()
- && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++)
+ && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++)
boxes.push_back (Box (elements[i]->extent (x_common, X_AXIS),
elements[i]->extent (y_common, Y_AXIS)));
+
Drul_array<Skyline> skylines (Skyline (boxes, X_AXIS, DOWN),
Skyline (boxes, X_AXIS, UP));
for (; i < elements.size (); i++)
"elements "
"common-refpoint-of-elements "
"pure-relevant-elements "
+ "skyline-spacing "
"cached-pure-extents "
);
vector<Beam_segment>
Beam::get_beam_segments (Grob *me_grob, Grob **common)
{
+ /* ugh, this has a side-effect that we need to ensure that
+ Stem #'beaming is correct */
+ (void) me_grob->get_property ("quantized-positions");
+
Spanner *me = dynamic_cast<Spanner*> (me_grob);
extract_grob_set (me, "stems", stems);
text_spanner_->set_bound (LEFT, col);
text_spanner_->set_property ("text", short_text_);
text_spanner_->set_property ("long-text", long_text_);
+
+ /*
+ UGH, should handle this in Score_engraver.
+ */
+ Grob *system = unsmob_grob (get_property ("rootSystem"));
+ if (system)
+ Axis_group_interface::add_element (system, text_spanner_);
+ else
+ text_spanner_->programming_error ("can't find root system");
}
Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), false);
- System *system = get_root_system (text_spanner_);
-
- /*
- UGH, should handle this in Score_engraver.
- */
- if (system)
- Axis_group_interface::add_element (system, text_spanner_);
- else
- text_spanner_->programming_error ("can't find root system");
-
text_spanner_ = 0;
}
list<Building>::const_iterator j = other.buildings_.begin ();
Real dist = -infinity_f;
- for (; i != buildings_.end () && j != other.buildings_.end (); i++)
+ while (i != buildings_.end () && j != other.buildings_.end ())
{
- while (j->iv_[RIGHT] < i->iv_[LEFT])
- j++;
-
Interval iv = intersection (i->iv_, j->iv_);
dist = max (dist, max (i->height (iv[LEFT]) + j->height (iv[LEFT]),
i->height (iv[RIGHT]) + j->height (iv[RIGHT])));
+ if (i->iv_[RIGHT] <= j->iv_[RIGHT])
+ i++;
+ else
+ j++;
}
return dist;
}
(spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.")
(skyline-distance ,number? "The distance between this staff and the next one, as determined by a skyline algorithm.")
+ (skyline-spacing ,boolean? "When true, this axis-group will vertically space its children
+using a skyline algorithm.")
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ancient notation
(axes . (0 1))
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:axis-group-interface::height)
+ (skyline-spacing . #t)
(meta . ((class . System)
(interfaces . (system-interface
axis-group-interface))))))
(Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
(Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
(X-extent . ,ly:axis-group-interface::width)
+ (skyline-spacing . #t)
(meta . ((class . Spanner)
(interfaces . (axis-group-interface
hara-kiri-group-interface