]> git.donarmstrong.com Git - lilypond.git/blob - lily/pango-select.cc
Issue 4550 (1/2) Avoid "using namespace std;" in included files
[lilypond.git] / lily / pango-select.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2004--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 "dimensions.hh"
21 #include "all-font-metrics.hh"
22 #include "libc-extension.hh"
23 #include "output-def.hh"
24 #include "pango-font.hh"
25
26 using std::string;
27
28 PangoFontDescription *
29 properties_to_pango_description (SCM chain, Real text_size)
30 {
31   SCM name = ly_chain_assoc_get (ly_symbol2scm ("font-name"), chain, SCM_BOOL_F);
32
33   PangoFontDescription *description = 0;
34   if (scm_is_string (name))
35     {
36       string name_str = ly_scm2string (name);
37       description = pango_font_description_from_string (name_str.c_str ());
38     }
39   else
40     {
41       SCM family = ly_chain_assoc_get (ly_symbol2scm ("font-family"), chain,
42                                        SCM_BOOL_F);
43       SCM variant = ly_chain_assoc_get (ly_symbol2scm ("font-shape"), chain,
44                                         SCM_BOOL_F);
45
46       SCM style = ly_chain_assoc_get (ly_symbol2scm ("font-shape"), chain,
47                                       SCM_BOOL_F);
48       SCM weight = ly_chain_assoc_get (ly_symbol2scm ("font-series"), chain,
49                                        SCM_BOOL_F);
50
51       description
52         = symbols_to_pango_font_description (family, style, variant, weight,
53                                              SCM_BOOL_F);
54     }
55
56   Real step = robust_scm2double (ly_chain_assoc_get (ly_symbol2scm ("font-size"), chain, SCM_BOOL_F),
57                                  0.0);
58   Real size = text_size * pow (2.0, step / 6.0);
59
60   pango_font_description_set_size (description,
61                                    gint (my_round (size * PANGO_SCALE)));
62   return description;
63 }
64
65 Font_metric *
66 select_pango_font (Output_def *layout, SCM chain)
67 {
68   PangoFontDescription *pfd
69     = properties_to_pango_description (chain,
70                                        point_constant
71                                        * layout->get_dimension (ly_symbol2scm ("text-font-size")));
72
73   char *str = pango_font_description_to_string (pfd);
74   SCM scm_str = scm_from_locale_string (str);
75   g_free (str);
76   pango_font_description_free (pfd);
77
78   return find_pango_font (layout, scm_str, 1.0);
79 }
80
81 PangoStyle
82 symbol_to_pango_style (SCM style)
83 {
84   PangoStyle pstyle = PANGO_STYLE_NORMAL;
85   if (scm_is_eq (style, ly_symbol2scm ("italic")))
86     pstyle = PANGO_STYLE_ITALIC;
87   else if (scm_is_eq (style, ly_symbol2scm ("oblique"))
88            || scm_is_eq (style, ly_symbol2scm ("slanted")))
89     pstyle = PANGO_STYLE_OBLIQUE;
90
91   return pstyle;
92 }
93
94 PangoVariant
95 symbol_to_pango_variant (SCM variant)
96 {
97   PangoVariant pvariant = PANGO_VARIANT_NORMAL;
98   if (scm_is_eq (variant, ly_symbol2scm ("caps")))
99     pvariant = PANGO_VARIANT_SMALL_CAPS;
100   return pvariant;
101 }
102
103 PangoWeight
104 symbol_to_pango_weight (SCM weight)
105 {
106   PangoWeight pw = PANGO_WEIGHT_NORMAL;
107   if (scm_is_eq (weight, ly_symbol2scm ("bold")))
108     pw = PANGO_WEIGHT_BOLD;
109   if (scm_is_eq (weight, ly_symbol2scm ("heavy")))
110     pw = PANGO_WEIGHT_HEAVY;
111   if (scm_is_eq (weight, ly_symbol2scm ("ultrabold")))
112     pw = PANGO_WEIGHT_ULTRABOLD;
113   if (scm_is_eq (weight, ly_symbol2scm ("light")))
114     pw = PANGO_WEIGHT_LIGHT;
115   if (scm_is_eq (weight, ly_symbol2scm ("ultralight")))
116     pw = PANGO_WEIGHT_ULTRALIGHT;
117
118   return pw;
119 }
120
121 PangoStretch
122 symbol_to_pango_stretch (SCM) //  stretch)
123 {
124   PangoStretch ps = PANGO_STRETCH_NORMAL;
125
126   /*
127   // TODO
128
129   PANGO_STRETCH_ULTRA_CONDENSED,
130   PANGO_STRETCH_EXTRA_CONDENSED,
131   PANGO_STRETCH_CONDENSED,
132   PANGO_STRETCH_SEMI_CONDENSED,
133
134   PANGO_STRETCH_SEMI_EXPANDED,
135   PANGO_STRETCH_EXPANDED,
136   PANGO_STRETCH_EXTRA_EXPANDED,
137   PANGO_STRETCH_ULTRA_EXPANDED
138   */
139   return ps;
140 }
141
142 PangoFontDescription *
143 symbols_to_pango_font_description (SCM family,
144                                    SCM style,
145                                    SCM variant,
146                                    SCM weight,
147                                    SCM stretch)
148 {
149   PangoFontDescription *description = pango_font_description_new ();
150
151   string family_str = "roman";
152   if (scm_is_symbol (family))
153     family_str = ly_symbol2string (family);
154   else if (scm_is_string (family))
155     family_str = ly_scm2string (family);
156
157   pango_font_description_set_family (description,
158                                      family_str.c_str ());
159   pango_font_description_set_style (description,
160                                     symbol_to_pango_style (style));
161   pango_font_description_set_variant (description,
162                                       symbol_to_pango_variant (variant));
163   pango_font_description_set_weight (description,
164                                      symbol_to_pango_weight (weight));
165   pango_font_description_set_stretch (description,
166                                       symbol_to_pango_stretch (stretch));
167
168   return description;
169 }