]> git.donarmstrong.com Git - lilypond.git/blob - lily/output-def-scheme.cc
88d6f28c49666e76d8788141171128078f45abcf
[lilypond.git] / lily / output-def-scheme.cc
1 /*
2   output-def-scheme.cc --  implement Output_def bindings
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 "font-metric.hh"
11 #include "output-def.hh"
12 #include "ly-module.hh"
13 #include "context-def.hh"
14
15 LY_DEFINE (ly_layout_lookup, "ly:output-def-lookup",
16            2, 0, 0, (SCM pap, SCM sym),
17            "Lookup @var{sym} in @var{pap}. "
18            "Return the value or @code{'()} if undefined.")
19 {
20   Output_def *op = unsmob_output_def (pap);
21   SCM_ASSERT_TYPE (op, pap, SCM_ARG1, __FUNCTION__, "Output_def");
22   SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
23
24   return op->lookup_variable (sym);
25 }
26
27 LY_DEFINE (ly_output_def_scope, "ly:output-def-scope",
28            1, 0, 0, (SCM def),
29            "Get the variable scope inside @var{def}.")
30 {
31   Output_def *op = unsmob_output_def (def);
32   SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition");
33   return op->scope_;
34 }
35
36 LY_DEFINE (ly_output_def_parent, "ly:output-def-parent",
37            1, 0, 0, (SCM def),
38            "Get the parent output-def of @var{def}.")
39 {
40   Output_def *op = unsmob_output_def (def);
41   SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition");
42   return op->parent_ ? op->parent_->self_scm () : SCM_EOL;
43 }
44
45 LY_DEFINE (ly_output_def_clone, "ly:output-def-clone",
46            1, 0, 0, (SCM def),
47            "Clone @var{def}.")
48 {
49   Output_def *op = unsmob_output_def (def);
50   SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition");
51   SCM s = op->clone ()->self_scm ();
52   scm_gc_unprotect_object (s);
53   return s;
54 }
55
56 LY_DEFINE (ly_output_description, "ly:output-description",
57            1, 0, 0, (SCM output_def),
58            "Return the description of translators in @var{output-def}.")
59 {
60   Output_def *id = unsmob_output_def (output_def);
61   
62   SCM al = ly_module2alist (id->scope_);
63
64   SCM ell = SCM_EOL;
65   for (SCM s = al; scm_is_pair (s); s = scm_cdr (s))
66     {
67       Context_def * td = unsmob_context_def (scm_cdar (s));
68       SCM key = scm_caar (s);
69       if (td && key == td->get_context_name ())
70         ell = scm_cons (scm_cons (key, td->to_alist ()),  ell);
71     }
72   return ell;  
73 }
74
75 LY_DEFINE (ly_layout_def_p, "ly:layout-def?",
76            1, 0, 0, (SCM def),
77            "Is @var{def} a layout definition?")
78 {
79   return ly_bool2scm (unsmob_output_def (def));
80 }
81
82 LY_DEFINE (ly_paper_outputscale, "ly:paper-outputscale",
83           1, 0, 0, (SCM bp),
84           "Get outputscale for BP.")
85 {
86   Output_def *b = unsmob_output_def (bp);
87   SCM_ASSERT_TYPE (b, bp, SCM_ARG1, __FUNCTION__, "paper");
88   return scm_make_real (output_scale (b));
89 }
90
91 LY_DEFINE (ly_make_output_def, "ly:make-output-def",
92            0, 0, 0, (),
93            "Make a output def.")
94 {
95   Output_def *bp = new Output_def ;
96   return scm_gc_unprotect_object (bp->self_scm ());
97 }
98
99 LY_DEFINE (ly_paper_get_font, "ly:paper-get-font", 2, 0, 0,
100            (SCM paper_smob, SCM chain),
101
102            "Return a font metric satisfying the font-qualifiers "
103            "in the alist chain @var{chain}.\n"
104            "(An alist chain is a list of alists, "
105            "containing grob properties).\n")
106 {
107   Output_def *paper = unsmob_output_def (paper_smob);
108   SCM_ASSERT_TYPE (paper, paper_smob, SCM_ARG1,
109                    __FUNCTION__, "paper definition");
110   
111   Font_metric *fm = select_font (paper, chain);
112   return fm->self_scm ();
113 }
114
115 LY_DEFINE (ly_paper_get_number, "ly:paper-get-number", 2, 0, 0,
116            (SCM layout_smob, SCM name),
117            "Return the layout variable @var{name}.")
118 {
119   Output_def *layout = unsmob_output_def (layout_smob);
120   SCM_ASSERT_TYPE (layout, layout_smob, SCM_ARG1,
121                    __FUNCTION__, "layout definition");
122   return scm_make_real (layout->get_dimension (name));
123 }