]> git.donarmstrong.com Git - lilypond.git/blob - lily/output-def-scheme.cc
Web-ja: update introduction
[lilypond.git] / lily / output-def-scheme.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2005--2015 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 (SCM_UNBNDP (answer))
40     {
41       if (SCM_UNBNDP (val))
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 && scm_is_eq (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 const char
135 * const Output_def::type_p_name_ = "ly:output-def?";
136
137 LY_DEFINE (ly_paper_outputscale, "ly:paper-outputscale",
138            1, 0, 0, (SCM def),
139            "Return the output-scale for output definition @var{def}.")
140 {
141   LY_ASSERT_SMOB (Output_def, def, 1);
142   Output_def *b = unsmob<Output_def> (def);
143   return scm_from_double (output_scale (b));
144 }
145
146 LY_DEFINE (ly_make_output_def, "ly:make-output-def",
147            0, 0, 0, (),
148            "Make an output definition.")
149 {
150   Output_def *bp = new Output_def;
151   return bp->unprotect ();
152 }
153
154 LY_DEFINE (ly_paper_get_font, "ly:paper-get-font",
155            2, 0, 0, (SCM def, SCM chain),
156            "Find a font metric in output definition @var{def} satisfying"
157            " the font-qualifiers in alist chain @var{chain}, and return"
158            " it.  (An alist chain is a list of alists, containing grob"
159            " properties.)")
160 {
161   LY_ASSERT_SMOB (Output_def, def, 1);
162
163   Output_def *paper = unsmob<Output_def> (def);
164   Font_metric *fm = select_font (paper, chain);
165   return fm->self_scm ();
166 }
167
168 LY_DEFINE (ly_paper_get_number, "ly:paper-get-number",
169            2, 0, 0, (SCM def, SCM sym),
170            "Return the value of variable @var{sym} in output definition"
171            " @var{def} as a double.")
172 {
173   LY_ASSERT_SMOB (Output_def, def, 1);
174   Output_def *layout = unsmob<Output_def> (def);
175   return scm_from_double (layout->get_dimension (sym));
176 }
177
178 LY_DEFINE (ly_paper_fonts, "ly:paper-fonts",
179            1, 0, 0, (SCM def),
180            "Return a list containing the fonts from output definition"
181            " @var{def} (e.g., @code{\\paper}).")
182 {
183   LY_ASSERT_SMOB (Output_def, def, 1);
184   Output_def *b = unsmob<Output_def> (def);
185
186   SCM tab1 = b->lookup_variable (ly_symbol2scm ("scaled-fonts"));
187   SCM tab2 = b->lookup_variable (ly_symbol2scm ("pango-fonts"));
188
189   SCM alist1 = SCM_EOL;
190   if (to_boolean (scm_hash_table_p (tab1)))
191     {
192       alist1 = scm_append (ly_alist_vals (ly_hash2alist (tab1)));
193
194       alist1 = ly_alist_vals (alist1);
195     }
196
197   SCM alist2 = SCM_EOL;
198   if (scm_is_true (scm_hash_table_p (tab2)))
199     {
200       // strip original-fonts/pango-font-descriptions
201       alist2 = scm_append (ly_alist_vals (ly_hash2alist (tab2)));
202
203       // strip size factors
204       alist2 = ly_alist_vals (alist2);
205     }
206
207   SCM alist = scm_append (scm_list_2 (alist1, alist2));
208   SCM font_list = SCM_EOL;
209   for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s))
210     {
211       SCM entry = scm_car (s);
212
213       Font_metric *fm = unsmob<Font_metric> (entry);
214
215       if (dynamic_cast<Modified_font_metric *> (fm)
216           || dynamic_cast<Pango_font *> (fm))
217         font_list = scm_cons (fm->self_scm (), font_list);
218     }
219
220   return font_list;
221 }