]> git.donarmstrong.com Git - lilypond.git/blob - lily/grob-closure.cc
Doc: NR - using \unfoldRepeat with \addQuote
[lilypond.git] / lily / grob-closure.cc
1 #include "grob.hh"
2 #include "simple-closure.hh"
3 #include "unpure-pure-container.hh"
4 #include "lily-imports.hh"
5
6 SCM
7 axis_offset_symbol (Axis a)
8 {
9   return a == X_AXIS
10          ? ly_symbol2scm ("X-offset")
11          : ly_symbol2scm ("Y-offset");
12 }
13
14 SCM
15 axis_parent_positioning (Axis a)
16 {
17   return (a == X_AXIS)
18          ? Grob::x_parent_positioning_proc
19          : Grob::y_parent_positioning_proc;
20 }
21
22 /*
23   Replace
24
25   (orig-proc GROB)
26
27   by
28
29   (+ (PROC GROB) (orig-proc GROB))
30 */
31 void
32 add_offset_callback (Grob *g, SCM proc, Axis a)
33 {
34   SCM data = g->get_property_data (axis_offset_symbol (a));
35   if (!scm_is_number (data)
36       && !ly_is_procedure (data)
37       && !unsmob<Simple_closure> (data))
38     {
39       g->set_property (axis_offset_symbol (a), proc);
40       return;
41     }
42
43   if (ly_is_procedure (data) || unsmob<Unpure_pure_container> (data))
44     data = Simple_closure::make_smob (scm_list_1 (data));
45   else if (Simple_closure *sc = unsmob<Simple_closure> (data))
46     data = sc->expression ();
47
48   if (ly_is_procedure (proc))
49     proc = Simple_closure::make_smob (scm_list_1 (proc));
50
51   SCM expr = scm_list_3 (Guile_user::plus, proc, data);
52   g->set_property (axis_offset_symbol (a), Simple_closure::make_smob (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) || unsmob<Unpure_pure_container> (data))
70     data = Simple_closure::make_smob (scm_list_1 (data));
71   else if (Simple_closure *sc = unsmob<Simple_closure> (data))
72     data = sc->expression ();
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                    Simple_closure::make_smob (Simple_closure::make_smob (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 }