X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-scheme.cc;h=b31447ffac38b547a9f232baeee325875bac496b;hb=5383cafcc75ae088f833df0081e2b2a73a5442a1;hp=d510a11bcb9a327f47db2fa0ad3c94fb70497080;hpb=6ec65b15b95eb3bd700579a9f85ce209ecd0812d;p=lilypond.git diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index d510a11bcb..b31447ffac 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -9,7 +9,7 @@ #include "grob.hh" -#include "warn.hh" +#include "warn.hh" // error() #include "item.hh" #include "output-def.hh" #include "system.hh" @@ -19,13 +19,11 @@ LY_DEFINE (ly_grob_property_data, "ly:grob-property-data", 2, 0, 0, (SCM grob, SCM sym), - //, SCM dfault), "Retrieve @var{sym} for @var{grob} but don't process callbacks.") { Grob *sc = unsmob_grob (grob); SCM_ASSERT_TYPE (sc, grob, SCM_ARG1, __FUNCTION__, "grob"); SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); - // SCM_ASSERT_TYPE (ly_is_procedure (proc), proc, SCM_ARG3, __FUNCTION__, "procedure"); return sc->get_property_data (sym); } @@ -42,7 +40,7 @@ LY_DEFINE (ly_grob_set_property_x, "ly:grob-set-property!", && !type_check_assignment (sym, val, ly_symbol2scm ("backend-type?"))) error ("typecheck failed"); - sc->internal_set_property (sym, val); + sc->set_property (sym, val); return SCM_UNSPECIFIED; } @@ -69,7 +67,7 @@ LY_DEFINE (ly_grob_property, "ly:grob-property", LY_DEFINE (ly_grob_interfaces, "ly:grob-interfaces", 1, 0, 0, (SCM grob), - "Return the interfaces list of grob @var{grob}.") + "Return the interfaces list of grob @var{grob}.") { Grob *sc = unsmob_grob (grob); SCM_ASSERT_TYPE (sc, grob, SCM_ARG1, __FUNCTION__, "grob"); @@ -156,6 +154,28 @@ LY_DEFINE (ly_get_extent, "ly:grob-extent", return ly_interval2scm (sc->extent (ref, a)); } +LY_DEFINE (ly_grob_robust_relative_extent, "ly:grob-robust-relative-extent", + 3, 0, 0, (SCM grob, SCM refp, SCM axis), + "Get the extent in @var{axis} direction of @var{grob} relative to " + "the grob @var{refp}, or (0,0) if empty") +{ + Grob *sc = unsmob_grob (grob); + Grob *ref = unsmob_grob (refp); + + SCM_ASSERT_TYPE (sc, grob, SCM_ARG1, __FUNCTION__, "grob"); + SCM_ASSERT_TYPE (ref, refp, SCM_ARG2, __FUNCTION__, "grob"); + SCM_ASSERT_TYPE (is_axis (axis), axis, SCM_ARG3, __FUNCTION__, "axis"); + + Axis a = Axis (scm_to_int (axis)); + + if (ref->common_refpoint (sc, a) != ref) + { + // ugh. should use other error message + SCM_ASSERT_TYPE (false, refp, SCM_ARG2, __FUNCTION__, "common refpoint"); + } + + return ly_interval2scm (robust_relative_extent (sc, ref, a)); +} LY_DEFINE (ly_grob_relative_coordinate, "ly:grob-relative-coordinate", 3, 0, 0, (SCM grob, SCM refp, SCM axis), @@ -309,6 +329,12 @@ LY_DEFINE (ly_grob_default_font, "ly:grob-default-font", return Font_interface::get_default_font (gr)->self_scm (); } + +/* + TODO: consider swapping order, so we can do + + (grob-common-refpoint a b c d e) + */ LY_DEFINE (ly_grob_common_refpoint, "ly:grob-common-refpoint", 3, 0, 0, (SCM grob, SCM other, SCM axis), "Find the common refpoint of @var{grob} and @var{other} for @var{axis}."