+LY_DEFINE (ly_grob_pure_property, "ly:grob-pure-property",
+ 4, 1, 0, (SCM grob, SCM sym, SCM beg, SCM end, SCM val),
+ "Return the pure value for property @var{sym} of @var{grob}."
+ " If no value is found, return @var{val} or @code{'()}"
+ " if @var{val} is not specified.")
+{
+ Grob *sc = unsmob<Grob> (grob);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
+ LY_ASSERT_TYPE (scm_is_integer, beg, 3);
+ LY_ASSERT_TYPE (scm_is_integer, end, 4);
+ if (SCM_UNBNDP (val))
+ val = SCM_EOL;
+
+ SCM retval = sc->internal_get_pure_property (sym, scm_to_int (beg), scm_to_int (end));
+ if (scm_is_null (retval))
+ retval = val;
+
+ return retval;
+}
+
+LY_DEFINE (ly_grob_pure_height, "ly:grob-pure-height",
+ 4, 1, 0, (SCM grob, SCM refp, SCM beg, SCM end, SCM val),
+ "Return the pure height of @var{grob} given refpoint @var{refp}."
+ " If no value is found, return @var{val} or @code{'()}"
+ " if @var{val} is not specified.")
+{
+ Grob *sc = unsmob<Grob> (grob);
+ Grob *ref = unsmob<Grob> (refp);
+
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_SMOB (Grob, refp, 2);
+ LY_ASSERT_TYPE (scm_is_integer, beg, 3);
+ LY_ASSERT_TYPE (scm_is_integer, end, 4);
+ if (SCM_UNBNDP (val))
+ val = SCM_EOL;
+
+ Interval retval = sc->pure_y_extent (ref, scm_to_int (beg), scm_to_int (end));
+
+ return ly_interval2scm (retval);
+}
+