]> git.donarmstrong.com Git - lilypond.git/blob - lily/grob-closure.cc
Imported Upstream version 2.16.0
[lilypond.git] / lily / grob-closure.cc
1 #include "grob.hh"
2 #include "simple-closure.hh"
3
4 SCM
5 axis_offset_symbol (Axis a)
6 {
7   return a == X_AXIS
8          ? ly_symbol2scm ("X-offset")
9          : ly_symbol2scm ("Y-offset");
10 }
11
12 SCM
13 axis_parent_positioning (Axis a)
14 {
15   return (a == X_AXIS)
16          ? Grob::x_parent_positioning_proc
17          : Grob::y_parent_positioning_proc;
18 }
19
20 /*
21   Replace
22
23   (orig-proc GROB)
24
25   by
26
27   (+ (PROC GROB) (orig-proc GROB))
28 */
29 void
30 add_offset_callback (Grob *g, SCM proc, Axis a)
31 {
32   SCM data = g->get_property_data (axis_offset_symbol (a));
33   if (!scm_is_number (data)
34       && !ly_is_procedure (data)
35       && !is_simple_closure (data))
36     {
37       g->set_property (axis_offset_symbol (a), proc);
38       return;
39     }
40
41   if (ly_is_procedure (data))
42     data = ly_make_simple_closure (scm_list_1 (data));
43   else if (is_simple_closure (data))
44     data = simple_closure_expression (data);
45
46   SCM plus = ly_lily_module_constant ("+");
47
48   if (ly_is_procedure (proc))
49     proc = ly_make_simple_closure (scm_list_1 (proc));
50
51   SCM expr = scm_list_3 (plus, proc, data);
52   g->set_property (axis_offset_symbol (a), ly_make_simple_closure (expr));
53 }
54
55 /*
56   replace
57
58   (orig-proc GROB)
59
60   by
61
62   (PROC GROB (orig-proc GROB))
63 */
64 void
65 chain_callback (Grob *g, SCM proc, SCM sym)
66 {
67   SCM data = g->get_property_data (sym);
68
69   if (ly_is_procedure (data))
70     data = ly_make_simple_closure (scm_list_1 (data));
71   else if (is_simple_closure (data))
72     data = simple_closure_expression (data);
73   else
74     /*
75       Data may be nonnumber. In that case, it is assumed to be
76       undefined.
77     */
78
79     data = SCM_UNDEFINED;
80
81   SCM expr = scm_list_2 (proc, data);
82   g->set_property (sym,
83
84                    // twice: one as a wrapper for grob property routines,
85                    // once for the actual delayed binding.
86                    ly_make_simple_closure (ly_make_simple_closure (expr)));
87 }
88
89 void
90 chain_offset_callback (Grob *g, SCM proc, Axis a)
91 {
92   chain_callback (g, proc, axis_offset_symbol (a));
93 }