X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-scheme.cc;h=9554883464f4d5c5d74d47cac737a286e42e41c4;hb=7d870a2890deabfa746d2c17038a00fa9afb8897;hp=c53aa6304dc05237af0b7fca29af457444ec068f;hpb=794dcbdb52faf4292036cd1b0270a956cf4316a3;p=lilypond.git diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index c53aa6304d..9554883464 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -1,10 +1,21 @@ /* - grob-scheme.cc -- Scheme entry points for the grob datatype + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter - - (c) 1998--2009 Jan Nieuwenhuizen + Copyright (C) 1998--2011 Jan Nieuwenhuizen Han-Wen Nienhuys + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "warn.hh" // error () @@ -45,6 +56,27 @@ LY_DEFINE (ly_grob_set_property_x, "ly:grob-set-property!", return SCM_UNSPECIFIED; } +LY_DEFINE (ly_grob_set_nested_property_x, "ly:grob-set-nested-property!", + 3, 0, 0, (SCM grob, SCM symlist, SCM val), + "Set nested property @var{symlist} in grob @var{grob} to value @var{val}.") +{ + Grob *sc = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + + bool type_ok = ly_cheap_is_list (symlist); + + if (type_ok) + for (SCM s = symlist; scm_is_pair (s) && type_ok; s = scm_cdr (s)) + type_ok &= ly_is_symbol (scm_car (s)); + + SCM_ASSERT_TYPE (type_ok, symlist, SCM_ARG2, __FUNCTION__, "list of symbols"); + + set_nested_property (sc, symlist, val); + return SCM_UNSPECIFIED; +} + + LY_DEFINE (ly_grob_property, "ly:grob-property", 2, 1, 0, (SCM grob, SCM sym, SCM val), "Return the value for property @var{sym} of @var{grob}." @@ -79,9 +111,9 @@ LY_DEFINE (ly_grob_interfaces, "ly:grob-interfaces", LY_DEFINE (ly_grob_object, "ly:grob-object", 2, 0, 0, (SCM grob, SCM sym), - "Return the value of a pointer in grob@tie{}@var{g} of property" + "Return the value of a pointer in grob @var{grob} of property" " @var{sym}. It returns @code{'()} (end-of-list) if @var{sym}" - " is undefined in@tie{}@var{g}.") + " is undefined in @var{grob}.") { Grob *sc = unsmob_grob (grob); @@ -92,6 +124,18 @@ LY_DEFINE (ly_grob_object, "ly:grob-object", } +LY_DEFINE (ly_grob_set_object_x, "ly:grob-set-object!", + 3, 0, 0, (SCM grob, SCM sym, SCM val), + "Set @var{sym} in grob @var{grob} to value @var{val}.") +{ + Grob *sc = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (ly_is_symbol, sym, 2); + + sc->set_object (sym, val); + return SCM_UNSPECIFIED; +} /* TODO: make difference between scaled and unscalead variable in calling (i.e different funcs.) */ @@ -214,6 +258,22 @@ LY_DEFINE (ly_grob_parent, "ly:grob-parent", return par ? par->self_scm () : SCM_EOL; } +LY_DEFINE (ly_grob_set_parent_x, "ly:grob-set-parent!", + 3, 0, 0, (SCM grob, SCM axis, SCM parent_grob), + "Set @var{parent-grob} the parent of grob @var{grob} in axis @var{axis}.") +{ + Grob *gr = unsmob_grob (grob); + Grob *parent = unsmob_grob (parent_grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (is_axis, axis, 2); + LY_ASSERT_SMOB (Grob, parent_grob, 3); + + Axis a = Axis (scm_to_int (axis)); + gr->set_parent (parent, a); + return SCM_UNSPECIFIED; +} + LY_DEFINE (ly_grob_properties, "ly:grob-properties", 1, 0, 0, (SCM grob), "Get the mutable properties of @var{grob}.") @@ -277,7 +337,7 @@ LY_DEFINE (ly_grob_suicide_x, "ly:grob-suicide!", LY_DEFINE (ly_grob_translate_axis_x, "ly:grob-translate-axis!", 3, 0, 0, (SCM grob, SCM d, SCM a), - "Translate @var{g} on axis@tie{}@var{a} over" + "Translate @var{grob} on axis@tie{}@var{a} over" " distance@tie{}@var{d}.") { Grob *me = unsmob_grob (grob); @@ -292,7 +352,7 @@ LY_DEFINE (ly_grob_translate_axis_x, "ly:grob-translate-axis!", LY_DEFINE (ly_grob_default_font, "ly:grob-default-font", 1, 0, 0, (SCM grob), - "Return the default font for grob @var{gr}.") + "Return the default font for grob @var{grob}.") { Grob *gr = unsmob_grob (grob); @@ -342,3 +402,20 @@ LY_DEFINE (ly_grob_common_refpoint_of_array, "ly:grob-common-refpoint-of-array", Grob *refp = common_refpoint_of_array (ga->array (), gr, Axis (scm_to_int (axis))); return refp ? refp->self_scm () : SCM_BOOL_F; } + +LY_DEFINE (ly_grob_chain_callback, "ly:grob-chain-callback", + 3, 0, 0, (SCM grob, SCM proc, SCM sym), + "Find the callback that is stored as property" + " @var{sym} of grob @var{grob} and chain @var{proc}" + " to the head of this, meaning that it is called" + " using @var{grob} and the previous callback's result.") +{ + Grob *gr = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (ly_is_procedure, proc, 2); + LY_ASSERT_TYPE (ly_is_symbol, sym, 3); + + chain_callback (gr, proc, sym); + return SCM_UNSPECIFIED; +}