2 stencil-interpret.cc -- implement Stencil expression interpreting
4 source file of the GNU LilyPond music typesetter
6 (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
13 interpret_stencil_expression (SCM expr,
14 void (*func) (void *, SCM),
20 if (!scm_is_pair (expr))
23 SCM head = scm_car (expr);
25 if (head == ly_symbol2scm ("translate-stencil"))
27 o += ly_scm2offset (scm_cadr (expr));
28 expr = scm_caddr (expr);
30 else if (head == ly_symbol2scm ("combine-stencil"))
33 for (SCM x = scm_cdr (expr); scm_is_pair (x); x = scm_cdr (x))
34 interpret_stencil_expression (scm_car (x), func, func_arg, o);
37 else if (head == ly_symbol2scm ("grob-cause"))
39 SCM grob = scm_cadr (expr);
41 (*func) (func_arg, scm_list_3 (head,
42 ly_quote_scm (ly_offset2scm (o)), grob));
43 interpret_stencil_expression (scm_caddr (expr), func, func_arg, o);
44 (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin")));
47 else if (head == ly_symbol2scm ("color"))
49 SCM color = scm_cadr (expr);
50 SCM r = scm_car (color);
51 SCM g = scm_cadr (color);
52 SCM b = scm_caddr (color);
54 (*func) (func_arg, scm_list_4 (ly_symbol2scm ("setcolor"), r, g, b));
55 interpret_stencil_expression (scm_caddr (expr), func, func_arg, o);
56 (*func) (func_arg, scm_list_1 (ly_symbol2scm ("resetcolor")));
63 scm_list_4 (ly_symbol2scm ("placebox"),
64 scm_make_real (o[X_AXIS]),
65 scm_make_real (o[Y_AXIS]),
78 find_font_function (void *fs, SCM x)
80 Font_list *me = (Font_list *) fs;
82 if (scm_car (x) == ly_symbol2scm ("placebox"))
84 SCM args = scm_cdr (x);
85 SCM what = scm_caddr (args);
87 if (scm_is_pair (what))
89 SCM head = scm_car (what);
90 if (ly_symbol2scm ("text") == head)
91 me->fonts_ = scm_cons (scm_cadr (what), me->fonts_);
92 else if (head == ly_symbol2scm ("char"))
93 me->fonts_ = scm_cons (scm_cadr (what), me->fonts_);
99 find_expression_fonts (SCM expr)
105 interpret_stencil_expression (expr, &find_font_function,
106 (void *) & fl, Offset (0, 0));