X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext-property.cc;h=08ade8f954391ab4eec71e482063fa370e523663;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=5234d1113fccc00ccd1b9421697609bb72ea5f13;hpb=c790b5919ec06fb292e380a2d3d7856e86f16417;p=lilypond.git diff --git a/lily/context-property.cc b/lily/context-property.cc index 5234d1113f..08ade8f954 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2007 Han-Wen Nienhuys + (c) 2004--2008 Han-Wen Nienhuys */ #include "context.hh" @@ -16,13 +16,15 @@ #include "spanner.hh" #include "warn.hh" - +/* + like execute_general_pushpop_property(), but typecheck + grob_property_path and context_property. +*/ void general_pushpop_property (Context *context, SCM context_property, SCM grob_property_path, - SCM new_value - ) + SCM new_value) { if (!scm_is_symbol (context_property) || !scm_is_symbol (scm_car (grob_property_path))) @@ -32,13 +34,12 @@ general_pushpop_property (Context *context, assert (false); } - execute_general_pushpop_property (context, context_property, + sloppy_general_pushpop_property (context, context_property, grob_property_path, new_value); } /* - Grob descriptions (ie. alists with layout properties) are represented as a (ALIST . BASED-ON) pair, where BASED-ON is the alist defined in a parent context. BASED-ON should always be a tail @@ -49,8 +50,6 @@ general_pushpop_property (Context *context, indicates nested alists, eg. '(beamed-stem-lengths details) */ - - void execute_override_property (Context *context, SCM context_property, @@ -92,10 +91,10 @@ execute_override_property (Context *context, new_value); } - // it's tempting to replace the head of the list if it's the same - // property. However, we have to keep this info around, in case we have to - // \revert back to it. - + /* it's tempting to replace the head of the list if it's the same + property. However, we have to keep this info around, in case we have to + \revert back to it. + */ target_alist = scm_acons (symbol, new_value, target_alist); bool ok = true; @@ -115,37 +114,35 @@ execute_override_property (Context *context, } } +/* + do a pop (indicated by new_value==SCM_UNDEFINED) or push + */ void -execute_revert_property (Context *context, - SCM context_property, - SCM grob_property_path); - -void -execute_general_pushpop_property (Context *context, - SCM context_property, - SCM grob_property_path, - SCM new_value - ) +sloppy_general_pushpop_property (Context *context, + SCM context_property, + SCM grob_property_path, + SCM new_value) { - if (new_value != SCM_UNDEFINED) + if (new_value == SCM_UNDEFINED) + execute_revert_property (context, context_property, + grob_property_path); + else execute_override_property (context, context_property, grob_property_path, new_value); - else - execute_revert_property (context, context_property, - grob_property_path); } +/* + Revert the property given by property_path. +*/ void execute_revert_property (Context *context, SCM context_property, SCM grob_property_path) { - /* - revert. - */ SCM current_context_val = SCM_EOL; - if (context->where_defined (context_property, ¤t_context_val) == context) + if (context->where_defined (context_property, ¤t_context_val) + == context) { SCM current_alist = scm_car (current_context_val); SCM daddy = scm_cdr (current_context_val); @@ -158,11 +155,12 @@ execute_revert_property (Context *context, } SCM symbol = scm_car (grob_property_path); - if (scm_is_pair (scm_cdr (grob_property_path))) { SCM current_sub_alist = ly_assoc_get (symbol, current_alist, SCM_EOL); - SCM new_val = nested_property_revert_alist (current_sub_alist, scm_cdr (grob_property_path)); + SCM new_val + = nested_property_revert_alist (current_sub_alist, + scm_cdr (grob_property_path)); if (scm_is_pair (current_alist) && scm_caar (current_alist) == symbol @@ -179,17 +177,20 @@ execute_revert_property (Context *context, if (new_alist == daddy) context->unset_property (context_property); else - context->set_property (context_property, scm_cons (new_alist, daddy)); + context->set_property (context_property, + scm_cons (new_alist, daddy)); } } } - +/* + Convenience: a push/pop grob property using a single grob_property + as argument. +*/ void execute_pushpop_property (Context *context, SCM context_property, SCM grob_property, - SCM new_value - ) + SCM new_value) { general_pushpop_property (context, context_property, scm_list_1 (grob_property), @@ -214,14 +215,14 @@ apply_property_operations (Context *tg, SCM pre_init_ops) SCM context_prop = scm_car (entry); SCM val = scm_cadr (entry); SCM grob_prop_path = scm_cddr (entry); - execute_general_pushpop_property (tg, context_prop, grob_prop_path, val); + sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val); } else if (type == ly_symbol2scm ("pop")) { SCM context_prop = scm_car (entry); SCM val = SCM_UNDEFINED; SCM grob_prop_path = scm_cdr (entry); - execute_general_pushpop_property (tg, context_prop, grob_prop_path, val); + sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val); } else if (type == ly_symbol2scm ("assign")) tg->set_property (scm_car (entry), scm_cadr (entry));