Fixes Issue 1504, allowing feather beam line breaking.
[lilypond/patrick.git] / lily / font-select.cc
blobf9f42ae25e244781ab056f108e471b23b39a7ca5
1 /*
2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2003--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
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.
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.
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/>.
21 #include "dimensions.hh"
22 #include "all-font-metrics.hh"
23 #include "output-def.hh"
24 #include "font-interface.hh"
25 #include "warn.hh"
26 #include "pango-font.hh"
27 #include "main.hh"
29 Font_metric *
30 get_font_by_design_size (Output_def *layout, Real requested,
31 SCM font_vector)
33 int n = scm_c_vector_length (font_vector);
34 Real size = 1e6;
35 Real last_size = -1e6;
36 int i = 0;
38 SCM pango_description_string = SCM_EOL;
39 SCM last_pango_description_string = SCM_EOL;
40 for (; i < n; i++)
42 SCM entry = scm_c_vector_ref (font_vector, i);
44 if (scm_promise_p (entry) == SCM_BOOL_T)
46 Font_metric *fm = unsmob_metrics (scm_force (entry));
47 size = fm->design_size ();
49 #if HAVE_PANGO_FT2
50 else if (scm_is_pair (entry)
51 && scm_is_number (scm_car (entry))
52 && scm_is_string (scm_cdr (entry)))
54 size = scm_to_double (scm_car (entry));
55 pango_description_string
56 = scm_cdr (entry);
58 #endif
60 if (size > requested)
61 break;
62 last_size = size;
63 last_pango_description_string = pango_description_string;
66 if (i == n)
67 i = n - 1;
68 else if (i > 0)
70 if ((requested / last_size) < (size / requested))
72 i--;
73 size = last_size;
74 pango_description_string = last_pango_description_string;
78 Font_metric *fm = 0;
79 if (scm_is_string (pango_description_string))
81 #if HAVE_PANGO_FT2
82 return find_pango_font (layout,
83 pango_description_string,
84 requested / size);
85 #else
86 error ("Trying to retrieve pango font without HAVE_PANGO_FT2.");
87 #endif
89 else
90 fm = unsmob_metrics (scm_force (scm_c_vector_ref (font_vector, i)));
92 return find_scaled_font (layout, fm, requested / size);
95 Font_metric *
96 get_font_by_mag_step (Output_def *layout, Real requested_step,
97 SCM font_vector, Real default_size)
99 return get_font_by_design_size (layout, default_size
100 * pow (2.0, requested_step / 6.0),
101 font_vector);
105 properties_to_font_size_family (SCM fonts, SCM alist_chain)
107 return scm_call_2 (ly_lily_module_constant ("lookup-font"), fonts,
108 alist_chain);
111 Font_metric *
112 select_encoded_font (Output_def *layout, SCM chain)
114 SCM name = ly_chain_assoc_get (ly_symbol2scm ("font-name"), chain, SCM_BOOL_F);
116 if (!scm_is_string (name))
118 SCM fonts = layout->lookup_variable (ly_symbol2scm ("fonts"));
119 name = properties_to_font_size_family (fonts, chain);
122 #if HAVE_PANGO_FT2
123 if (scm_is_string (name))
124 return select_pango_font (layout, chain);
125 else
126 #endif
127 if (scm_instance_p (name))
129 SCM base_size = scm_slot_ref (name, ly_symbol2scm ("default-size"));
130 SCM vec = scm_slot_ref (name, ly_symbol2scm ("size-vector"));
132 Real req = robust_scm2double (ly_chain_assoc_get (ly_symbol2scm ("font-size"), chain, SCM_BOOL_F),
133 0.0);
135 return get_font_by_mag_step (layout, req, vec,
136 scm_to_double (base_size));
139 assert (0);
140 return 0;
143 Font_metric *
144 select_font (Output_def *layout, SCM chain)
146 return select_encoded_font (layout, chain);