2 all-font-metrics.cc -- implement All_font_metrics
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "all-font-metrics.hh"
11 #include "international.hh"
13 #include "open-type-font.hh"
14 #include "pango-font.hh"
15 #include "scm-hash.hh"
19 Index_to_charcode_map
const *
20 All_font_metrics::get_index_to_charcode_map (string filename
, FT_Face face
)
22 if (filename_charcode_maps_map_
.find (filename
)
23 == filename_charcode_maps_map_
.end ())
24 filename_charcode_maps_map_
[filename
] = make_index_to_charcode_map (face
);
26 return &filename_charcode_maps_map_
[filename
];
30 All_font_metrics::All_font_metrics (string path
)
32 otf_dict_
= new Scheme_hash_table
;
35 PangoFontMap
*pfm
= pango_ft2_font_map_new ();
38 = G_TYPE_CHECK_INSTANCE_CAST (pfm
,
39 PANGO_TYPE_FT2_FONT_MAP
,
42 pango_ft2_font_map_set_resolution (pango_ft2_fontmap_
,
43 pango_dpi_
, pango_dpi_
);
45 pango_dict_
= new Scheme_hash_table
;
48 search_path_
.parse_path (path
);
51 All_font_metrics::~All_font_metrics ()
53 otf_dict_
->unprotect ();
56 pango_dict_
->unprotect ();
57 g_object_unref (pango_ft2_fontmap_
);
61 All_font_metrics::All_font_metrics (All_font_metrics
const &)
68 All_font_metrics::find_pango_font (PangoFontDescription
const *description
,
72 gchar
*pango_fn
= pango_font_description_to_filename (description
);
73 SCM key
= ly_symbol2scm (pango_fn
);
76 if (!pango_dict_
->try_retrieve (key
, &val
))
78 if (be_verbose_global
)
79 progress_indication ("[" + string (pango_fn
));
81 Pango_font
*pf
= new Pango_font (pango_ft2_fontmap_
,
86 val
= pf
->self_scm ();
87 pango_dict_
->set (key
, val
);
90 if (be_verbose_global
)
91 progress_indication ("]");
93 pf
->description_
= scm_cons (SCM_BOOL_F
,
94 scm_from_double (1.0));
97 return dynamic_cast<Pango_font
*> (unsmob_metrics (val
));
104 All_font_metrics::find_otf (string name
)
106 SCM sname
= ly_symbol2scm (name
.c_str ());
108 if (!otf_dict_
->try_retrieve (sname
, &val
))
112 if (file_name
.empty ())
113 file_name
= search_path_
.find (name
+ ".otf");
114 if (file_name
.empty ())
117 if (be_verbose_global
)
118 progress_indication ("[" + file_name
);
120 val
= Open_type_font::make_otf (file_name
);
122 if (be_verbose_global
)
123 progress_indication ("]");
125 unsmob_metrics (val
)->file_name_
= file_name
;
126 SCM name_string
= ly_string2scm (name
);
127 unsmob_metrics (val
)->description_
= scm_cons (name_string
,
128 scm_from_double (1.0));
129 otf_dict_
->set (sname
, val
);
130 unsmob_metrics (val
)->unprotect ();
133 return dynamic_cast<Open_type_font
*> (unsmob_metrics (val
));
137 All_font_metrics::find_font (string name
)
139 Font_metric
*f
= find_otf (name
);
143 error (_f ("cannot find font: `%s'", name
.c_str ()));
149 All_font_metrics
*all_fonts_global
;