+MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_extent_aligned_anchor, 1)
+SCM
+Break_aligned_interface::calc_extent_aligned_anchor (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Real alignment = robust_scm2double (me->get_property ("break-align-anchor-alignment"), 0.0);
+ Interval iv = me->extent (me, X_AXIS);
+
+ if (isinf (iv[LEFT]) && isinf (iv[RIGHT])) /* avoid NaN */
+ return scm_from_double (0.0);
+
+ return scm_from_double (iv.linear_combination (alignment));
+}
+
+MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_break_visibility, 1)
+SCM
+Break_aligned_interface::calc_break_visibility (SCM smob)
+{
+ /* a BreakAlignGroup is break-visible iff it has one element that is break-visible */
+ Grob *me = unsmob_grob (smob);
+ SCM ret = scm_c_make_vector (3, SCM_EOL);
+ extract_grob_set (me, "elements", elts);
+ for (int dir = 0; dir <= 2; dir++)
+ {
+ bool visible = false;
+ for (vsize i = 0; i < elts.size (); i++)
+ {
+ SCM vis = elts[i]->get_property ("break-visibility");
+ if (scm_is_vector (vis) && to_boolean (scm_c_vector_ref (vis, dir)))
+ visible = true;
+ }
+ scm_c_vector_set_x (ret, dir, scm_from_bool (visible));
+ }
+ return ret;
+}
+
+ADD_INTERFACE (Break_alignable_interface,
+ "Object that is aligned on a break aligment.",
+
+ /* properties */
+ "break-align-symbols "
+ );