]> git.donarmstrong.com Git - lilypond.git/blob - lily/output-def-scheme.cc
Emit warnings for missing translations.
[lilypond.git] / lily / output-def-scheme.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2005--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
5
6   LilyPond is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   LilyPond is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "output-def.hh"
21
22 #include "pango-font.hh"
23 #include "modified-font-metric.hh"
24 #include "ly-module.hh"
25 #include "context-def.hh"
26 #include "lily-parser.hh"
27
28 LY_DEFINE (ly_output_def_lookup, "ly:output-def-lookup",
29            2, 1, 0, (SCM def, SCM sym, SCM val),
30            "Return the value of @var{sym} in output definition @var{def}"
31            " (e.g., @code{\\paper}).  If no value is found, return"
32            " @var{val} or @code{'()} if @var{val} is undefined.")
33 {
34   LY_ASSERT_SMOB (Output_def, def, 1);
35   Output_def *op = unsmob_output_def (def);
36   LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
37
38   SCM answer = op->lookup_variable (sym);
39   if (answer == SCM_UNDEFINED)
40     {
41       if (val == SCM_UNDEFINED)
42         val = SCM_EOL;
43
44       answer = val;
45     }
46
47   return answer;
48 }
49
50 LY_DEFINE (ly_output_def_scope, "ly:output-def-scope",
51            1, 0, 0, (SCM def),
52            "Return the variable scope inside @var{def}.")
53 {
54   LY_ASSERT_SMOB (Output_def, def, 1);
55   Output_def *op = unsmob_output_def (def);
56   return op->scope_;
57 }
58
59 LY_DEFINE (ly_output_def_parent, "ly:output-def-parent",
60            1, 0, 0, (SCM def),
61            "Return the parent output definition of @var{def}.")
62 {
63   LY_ASSERT_SMOB (Output_def, def, 1);
64   Output_def *op = unsmob_output_def (def);
65   return op->parent_ ? op->parent_->self_scm () : SCM_EOL;
66 }
67
68 LY_DEFINE (ly_output_def_set_variable_x, "ly:output-def-set-variable!",
69            3, 0, 0, (SCM def, SCM sym, SCM val),
70            "Set an output definition @var{def} variable @var{sym} to @var{val}.")
71 {
72   LY_ASSERT_SMOB (Output_def, def, 1);
73   Output_def *output_def = unsmob_output_def (def);
74   LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
75   output_def->set_variable (sym, val);
76   return SCM_UNSPECIFIED;
77 }
78
79 LY_DEFINE (ly_output_def_clone, "ly:output-def-clone",
80            1, 0, 0, (SCM def),
81            "Clone output definition @var{def}.")
82 {
83   LY_ASSERT_SMOB (Output_def, def, 1);
84   Output_def *op = unsmob_output_def (def);
85
86   Output_def *clone = op->clone ();
87   return clone->unprotect ();
88 }
89
90 LY_DEFINE (ly_output_description, "ly:output-description",
91            1, 0, 0, (SCM output_def),
92            "Return the description of translators in @var{output-def}.")
93 {
94   LY_ASSERT_SMOB (Output_def, output_def, 1);
95
96   Output_def *id = unsmob_output_def (output_def);
97
98   SCM al = ly_module_2_alist (id->scope_);
99   SCM ell = SCM_EOL;
100   for (SCM s = al; scm_is_pair (s); s = scm_cdr (s))
101     {
102       Context_def *td = unsmob_context_def (scm_cdar (s));
103       SCM key = scm_caar (s);
104       if (td && key == td->get_context_name ())
105         ell = scm_cons (scm_cons (key, td->to_alist ()), ell);
106     }
107   return ell;
108 }
109
110 LY_DEFINE (ly_output_find_context_def, "ly:output-find-context-def",
111            1, 1, 0, (SCM output_def, SCM context_name),
112            "Return an alist of all context defs (matching @var{context-name}"
113            "if given) in @var{output-def}.")
114 {
115   LY_ASSERT_SMOB (Output_def, output_def, 1);
116   if (!SCM_UNBNDP (context_name))
117     LY_ASSERT_TYPE (ly_is_symbol, context_name, 2);
118
119   Output_def *id = unsmob_output_def (output_def);
120
121   SCM al = ly_module_2_alist (id->scope_);
122   SCM ell = SCM_EOL;
123   for (SCM s = al; scm_is_pair (s); s = scm_cdr (s))
124     {
125       SCM p = scm_car (s);
126       Context_def *td = unsmob_context_def (scm_cdr (p));
127       if (td && scm_is_eq (scm_car (p), td->get_context_name ())
128           && (SCM_UNBNDP (context_name) || td->is_alias (context_name)))
129         ell = scm_cons (p, ell);
130     }
131   return ell;
132 }
133
134
135 LY_DEFINE (ly_output_def_p, "ly:output-def?",
136            1, 0, 0, (SCM def),
137            "Is @var{def} an output definition?")
138 {
139   return ly_bool2scm (unsmob_output_def (def));
140 }
141
142 LY_DEFINE (ly_paper_outputscale, "ly:paper-outputscale",
143            1, 0, 0, (SCM def),
144            "Return the output-scale for output definition @var{def}.")
145 {
146   LY_ASSERT_SMOB (Output_def, def, 1);
147   Output_def *b = unsmob_output_def (def);
148   return scm_from_double (output_scale (b));
149 }
150
151 LY_DEFINE (ly_make_output_def, "ly:make-output-def",
152            0, 0, 0, (),
153            "Make an output definition.")
154 {
155   Output_def *bp = new Output_def;
156   return bp->unprotect ();
157 }
158
159 LY_DEFINE (ly_paper_get_font, "ly:paper-get-font",
160            2, 0, 0, (SCM def, SCM chain),
161            "Find a font metric in output definition @var{def} satisfying"
162            " the font-qualifiers in alist chain @var{chain}, and return"
163            " it.  (An alist chain is a list of alists, containing grob"
164            " properties.)")
165 {
166   LY_ASSERT_SMOB (Output_def, def, 1);
167
168   Output_def *paper = unsmob_output_def (def);
169   Font_metric *fm = select_font (paper, chain);
170   return fm->self_scm ();
171 }
172
173 LY_DEFINE (ly_paper_get_number, "ly:paper-get-number",
174            2, 0, 0, (SCM def, SCM sym),
175            "Return the value of variable @var{sym} in output definition"
176            " @var{def} as a double.")
177 {
178   LY_ASSERT_SMOB (Output_def, def, 1);
179   Output_def *layout = unsmob_output_def (def);
180   return scm_from_double (layout->get_dimension (sym));
181 }
182
183 LY_DEFINE (ly_paper_fonts, "ly:paper-fonts",
184            1, 0, 0, (SCM def),
185            "Return a list containing the fonts from output definition"
186            " @var{def} (e.g., @code{\\paper}).")
187 {
188   LY_ASSERT_SMOB (Output_def, def, 1);
189   Output_def *b = unsmob_output_def (def);
190
191   SCM tab1 = b->lookup_variable (ly_symbol2scm ("scaled-fonts"));
192   SCM tab2 = b->lookup_variable (ly_symbol2scm ("pango-fonts"));
193
194   SCM alist1 = SCM_EOL;
195   if (scm_hash_table_p (tab1) == SCM_BOOL_T)
196     {
197       alist1 = scm_append (ly_alist_vals (ly_hash2alist (tab1)));
198
199       alist1 = ly_alist_vals (alist1);
200     }
201
202   SCM alist2 = SCM_EOL;
203   if (scm_hash_table_p (tab2) == SCM_BOOL_T)
204     {
205       // strip original-fonts/pango-font-descriptions
206       alist2 = scm_append (ly_alist_vals (ly_hash2alist (tab2)));
207
208       // strip size factors
209       alist2 = ly_alist_vals (alist2);
210     }
211
212   SCM alist = scm_append (scm_list_2 (alist1, alist2));
213   SCM font_list = SCM_EOL;
214   for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s))
215     {
216       SCM entry = scm_car (s);
217
218       Font_metric *fm = unsmob_metrics (entry);
219
220       if (dynamic_cast<Modified_font_metric *> (fm)
221           || dynamic_cast<Pango_font *> (fm))
222         font_list = scm_cons (fm->self_scm (), font_list);
223     }
224
225   return font_list;
226 }