]> git.donarmstrong.com Git - lilypond.git/blob - lily/stencil-interpret.cc
* lily/main.cc (setup_guile_env): new function. Set GC min_yields
[lilypond.git] / lily / stencil-interpret.cc
1 /*
2   stencil-interpret.cc --  implement Stencil expression interpreting 
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "stencil.hh"
11
12 void
13 interpret_stencil_expression (SCM expr,
14                               void (*func) (void *, SCM),
15                               void *func_arg,
16                               Offset o)
17 {
18   while (1)
19     {
20       if (!scm_is_pair (expr))
21         return;
22
23       SCM head = scm_car (expr);
24
25       if (head == ly_symbol2scm ("translate-stencil"))
26         {
27           o += ly_scm2offset (scm_cadr (expr));
28           expr = scm_caddr (expr);
29         }
30       else if (head == ly_symbol2scm ("combine-stencil"))
31         {
32
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);
35           return;
36         }
37       else if (head == ly_symbol2scm ("grob-cause"))
38         {
39           SCM grob = scm_cadr (expr);
40
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")));
45           return;
46         }
47       else if (head == ly_symbol2scm ("color"))
48         {
49           SCM color = scm_cadr (expr);
50           SCM r = scm_car (color);
51           SCM g = scm_cadr (color);
52           SCM b = scm_caddr (color);
53
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")));
57
58           return;
59         }
60       else
61         {
62           (*func) (func_arg,
63                    scm_list_4 (ly_symbol2scm ("placebox"),
64                                scm_from_double (o[X_AXIS]),
65                                scm_from_double (o[Y_AXIS]),
66                                expr));
67           return;
68         }
69     }
70 }
71
72 struct Font_list
73 {
74   SCM fonts_;
75 };
76
77 static void
78 find_font_function (void *fs, SCM x)
79 {
80   Font_list *me = (Font_list *) fs;
81
82   if (scm_car (x) == ly_symbol2scm ("placebox"))
83     {
84       SCM args = scm_cdr (x);
85       SCM what = scm_caddr (args);
86
87       if (scm_is_pair (what))
88         {
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_);
94         }
95     }
96 }
97
98 SCM
99 find_expression_fonts (SCM expr)
100 {
101   Font_list fl;
102
103   fl.fonts_ = SCM_EOL;
104
105   interpret_stencil_expression (expr, &find_font_function,
106                                 (void *) & fl, Offset (0, 0));
107
108   return fl.fonts_;
109 }