X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstencil-interpret.cc;h=15f44c0f820efbf6bfc5c87c0fc7bcc4f92bd4e1;hb=a6a51abfd0195a3cf7d6ea095cf69808852f21ce;hp=8214af5dcc8e40a427dcd80212a0931a74bcef6f;hpb=ad3a9e6531e32c4403f1bdc6d203d3c94c6d411e;p=lilypond.git diff --git a/lily/stencil-interpret.cc b/lily/stencil-interpret.cc index 8214af5dcc..15f44c0f82 100644 --- a/lily/stencil-interpret.cc +++ b/lily/stencil-interpret.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 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 @@ -21,7 +21,7 @@ void interpret_stencil_expression (SCM expr, - void (*func) (void *, SCM), + SCM (*func) (void *, SCM), void *func_arg, Offset o) { @@ -32,36 +32,40 @@ interpret_stencil_expression (SCM expr, SCM head = scm_car (expr); - if (head == ly_symbol2scm ("delay-stencil-evaluation")) + if (scm_is_eq (head, ly_symbol2scm ("delay-stencil-evaluation"))) { interpret_stencil_expression (scm_force (scm_cadr (expr)), func, func_arg, o); return; } - if (head == ly_symbol2scm ("footnote")) + if (scm_is_eq (head, ly_symbol2scm ("transparent-stencil"))) return; - if (head == ly_symbol2scm ("translate-stencil")) + if (scm_is_eq (head, ly_symbol2scm ("footnote"))) + return; + if (scm_is_eq (head, ly_symbol2scm ("translate-stencil"))) { o += ly_scm2offset (scm_cadr (expr)); expr = scm_caddr (expr); } - else if (head == ly_symbol2scm ("combine-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("combine-stencil"))) { for (SCM x = scm_cdr (expr); scm_is_pair (x); x = scm_cdr (x)) interpret_stencil_expression (scm_car (x), func, func_arg, o); return; } - else if (head == ly_symbol2scm ("grob-cause")) + else if (scm_is_eq (head, ly_symbol2scm ("grob-cause"))) { SCM grob = scm_cadr (expr); - (*func) (func_arg, scm_list_3 (head, - ly_quote_scm (ly_offset2scm (o)), grob)); + SCM link = + (*func) (func_arg, + scm_list_3 (head, ly_quote_scm (ly_offset2scm (o)), grob)); interpret_stencil_expression (scm_caddr (expr), func, func_arg, o); - (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin"))); + if (scm_is_true (link)) + (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin"))); return; } - else if (head == ly_symbol2scm ("color")) + else if (scm_is_eq (head, ly_symbol2scm ("color"))) { SCM color = scm_cadr (expr); SCM r = scm_car (color); @@ -74,17 +78,18 @@ interpret_stencil_expression (SCM expr, return; } - else if (head == ly_symbol2scm ("id")) + else if (scm_is_eq (head, ly_symbol2scm ("output-attributes"))) { - SCM id = scm_cadr (expr); + SCM attributes = scm_cadr (expr); - (*func) (func_arg, scm_list_2 (ly_symbol2scm ("start-enclosing-id-node"), id)); + (*func) (func_arg, scm_list_2 (ly_symbol2scm ("start-group-node"), + ly_quote_scm (attributes))); interpret_stencil_expression (scm_caddr (expr), func, func_arg, o); - (*func) (func_arg, scm_list_1 (ly_symbol2scm ("end-enclosing-id-node"))); + (*func) (func_arg, scm_list_1 (ly_symbol2scm ("end-group-node"))); return; } - else if (head == ly_symbol2scm ("rotate-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("rotate-stencil"))) { SCM args = scm_cadr (expr); SCM angle = scm_car (args); @@ -100,7 +105,7 @@ interpret_stencil_expression (SCM expr, return; } - else if (head == ly_symbol2scm ("scale-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("scale-stencil"))) { SCM args = scm_cadr (expr); SCM x_scale = scm_car (args); @@ -116,6 +121,10 @@ interpret_stencil_expression (SCM expr, return; } + else if (scm_is_eq (head, ly_symbol2scm ("with-outline"))) + { + expr = scm_caddr (expr); + } else { (*func) (func_arg, @@ -133,12 +142,12 @@ struct Font_list SCM fonts_; }; -static void +static SCM find_font_function (void *fs, SCM x) { Font_list *me = (Font_list *) fs; - if (scm_car (x) == ly_symbol2scm ("placebox")) + if (scm_is_eq (scm_car (x), ly_symbol2scm ("placebox"))) { SCM args = scm_cdr (x); SCM what = scm_caddr (args); @@ -146,12 +155,13 @@ find_font_function (void *fs, SCM x) if (scm_is_pair (what)) { SCM head = scm_car (what); - if (ly_symbol2scm ("text") == head) + if (scm_is_eq (head, ly_symbol2scm ("text"))) me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); - else if (head == ly_symbol2scm ("char")) + else if (scm_is_eq (head, ly_symbol2scm ("char"))) me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); } } + return SCM_BOOL_T; } SCM