+ "before-line-breaking "
+ "cause "
+ "color "
+ "extra-X-extent "
+ "extra-Y-extent "
+ "extra-offset "
+ "interfaces "
+ "layer "
+ "meta "
+ "minimum-X-extent "
+ "minimum-Y-extent "
+ "rotation "
+ "springs-and-rods "
+ "staff-symbol "
+ "stencil "
+ "transparent "
+ );
+
+
+
+
+
+/****************************************************************
+ CALLBACKS
+****************************************************************/
+
+
+static SCM
+grob_stencil_extent (Grob *me, Axis a)
+{
+ Stencil *m = me->get_stencil ();
+ Interval e;
+ if (m)
+ e = m->extent (a);
+ return ly_interval2scm (e);
+}
+
+
+MAKE_SCHEME_CALLBACK (Grob, stencil_height, 1);
+SCM
+Grob::stencil_height (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ return grob_stencil_extent (me, Y_AXIS);
+}
+
+MAKE_SCHEME_CALLBACK(Grob, y_parent_positioning, 1);
+SCM
+Grob::y_parent_positioning (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Grob *par = me->get_parent (Y_AXIS);
+ if (par)
+ (void) par->get_property ("positioning-done");
+
+ return scm_from_double (0.0);
+}
+
+
+MAKE_SCHEME_CALLBACK(Grob, x_parent_positioning, 1);
+SCM
+Grob::x_parent_positioning (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ Grob *par = me->get_parent (X_AXIS);
+ if (par)
+ (void) par->get_property ("positioning-done");
+
+ return scm_from_double (0.0);
+}
+
+MAKE_SCHEME_CALLBACK (Grob, stencil_width, 1);
+SCM
+Grob::stencil_width (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ return grob_stencil_extent (me, X_AXIS);
+}
+
+
+
+Grob *
+common_refpoint_of_list (SCM elist, Grob *common, Axis a)
+{
+ for (; scm_is_pair (elist); elist = scm_cdr (elist))
+ if (Grob *s = unsmob_grob (scm_car (elist)))
+ {
+ if (common)
+ common = common->common_refpoint (s, a);
+ else
+ common = s;
+ }
+
+ return common;
+}
+
+Grob *
+common_refpoint_of_array (vector<Grob*> const &arr, Grob *common, Axis a)
+{
+ for (vsize i = arr.size (); i--;)
+ if (Grob *s = arr[i])
+ {
+ if (common)
+ common = common->common_refpoint (s, a);
+ else
+ common = s;
+ }
+
+ return common;
+}
+
+Interval
+robust_relative_extent (Grob *me, Grob *refpoint, Axis a)
+{
+ Interval ext = me->extent (refpoint, a);
+ if (ext.is_empty ())
+ ext.add_point (me->relative_coordinate (refpoint, a));
+
+ return ext;
+}