X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fall-font-metrics.cc;h=5a3975fa9a709e5138509e6013f43363dfe69995;hb=ee513a2f7d18fc8d43e1c291350ed81856b0192d;hp=52e68e6a61618eeba67d4aa8353a2737604b2b0a;hpb=d6048913c2c793a6298a3e16a1a25c76711463b1;p=lilypond.git diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 52e68e6a61..5a3975fa9a 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -1,10 +1,20 @@ +/* + all-font-metrics.cc -- implement All_font_metrics + + source file of the GNU LilyPond music typesetter + + (c) 1999--2000 Han-Wen Nienhuys + + */ #include "main.hh" -#include "all-fonts.hh" +#include "all-font-metrics.hh" #include "debug.hh" #include "warn.hh" #include "afm.hh" #include "tfm.hh" +#include "lily-guile.hh" +#include "tfm-reader.hh" const char * default_font_sz_ = "cmr10"; @@ -16,47 +26,73 @@ All_font_metrics::All_font_metrics (String path) Adobe_font_metric * All_font_metrics::find_afm (String name) { - if (!afm_p_dict_.elem_b (name)) + SCM sname = ly_symbol2scm (name.ch_C ()); + if (!afm_p_dict_.elem_b (sname)) { String path = name + ".afm"; path = search_path_.find (path); if (path.empty_b ()) return 0; - - *mlog << "[" << path; - Adobe_font_metric - * afm_p = new Adobe_font_metric (read_afm_file (path)); - *mlog << "]" << flush ; + progress_indication ("[" + path); + Adobe_font_metric * afm_p = read_afm_file (path); - afm_p_dict_[name] = afm_p; + afm_p->name_ = ly_symbol2scm (name.ch_C ()); + progress_indication ("]"); + + afm_p_dict_.set (sname,afm_p->self_scm_); + } + + return dynamic_cast (unsmob_metrics (afm_p_dict_.get (sname))); +} + +Scaled_font_metric * +All_font_metrics::find_scaled (String nm, int m) +{ + Scaled_font_metric * s=0; + String index = nm + "@" + to_str (m); + SCM sname = ly_symbol2scm (index.ch_C ()); + + Font_metric *fm =0; + if (!scaled_p_dict_.elem_b (sname)) + { + Font_metric *f = find_font (nm); + s = new Scaled_font_metric (f, m); + scaled_p_dict_.set (sname, s->self_scm_); + fm = s; } - return afm_p_dict_[name]; + else + fm = unsmob_metrics (scaled_p_dict_.get (sname)); + + return dynamic_cast (fm); } Tex_font_metric * All_font_metrics::find_tfm (String name) { - if (!tfm_p_dict_.elem_b (name)) + SCM sname = ly_symbol2scm (name.ch_C ()); + if (!tfm_p_dict_.elem_b (sname)) { String path = name + ".tfm"; path = search_path_.find (path); if (path.empty_b ()) return 0; - - *mlog << "[" << path; - Tex_font_metric * tfm_p = new Tex_font_metric; - tfm_p->read_file (path); - *mlog << "]" << flush ; + progress_indication ("[" + path); + Tex_font_metric * tfm_p = Tex_font_metric_reader::read_file (path); + tfm_p->name_ = ly_symbol2scm (name.ch_C( )); + progress_indication ("]"); - tfm_p_dict_[name] = tfm_p; + tfm_p_dict_.set (sname, tfm_p->self_scm_); } - return tfm_p_dict_[name]; + + return + dynamic_cast (unsmob_metrics (tfm_p_dict_.get(sname))); } Font_metric * All_font_metrics::find_font (String name) -{ Font_metric * f=0; +{ + Font_metric * f=0; f = find_tfm (name); if (f) return f; @@ -65,10 +101,55 @@ All_font_metrics::find_font (String name) if (f) return f; - f = find_tfm (default_font_sz_); + warning (_f ("can't find font: `%s'", name.ch_C ())); + warning (_ ("Loading default font")); + + String def_name = default_font_sz_; + SCM l = ly_eval_str ("(style-to-cmr \"default\")"); + if (l != SCM_BOOL_F) + def_name = ly_scm2string (gh_cdr (l)); + + f = find_tfm (def_name); if (f) return f; - String s = _f("Can't find default font `%s\', giving up.", default_font_sz_); - s += String ("\n") + _f ("search path = %s", search_path_.str ()); - error (s); + + f= find_afm (def_name); + if (f) + return f; + + error (_f ("can't find default font: `%s'", def_name.ch_C ())); + error (_f ("(search path: `%s')", search_path_.str ())); + error (_ ("Giving up")); + + return 0; +} + +SCM +All_font_metrics::font_descriptions () const +{ + SCM l[] = {0,0,0}; + + l[0] = afm_p_dict_.to_alist (); + l[1] = tfm_p_dict_.to_alist (); + l[2] = scaled_p_dict_.to_alist (); + + SCM list = SCM_EOL; + for (int i=0; i < 3; i++) + { + for (SCM s = l[i]; gh_pair_p (s); s = gh_cdr (s)) + { + Font_metric * fm = unsmob_metrics (gh_cdar (s)); + + list = gh_cons (fm->description (), list); + } + } + return list; +} + + + +Font_metric* +find_font (String name) +{ + return all_fonts_global_p->find_font (name); }