lilypond-1.3.74
[lilypond.git] / lily / afm.cc
blobc86c1faafcd4980ee24f7492826dbc2841d14c79
1 /*
2 afm.cc -- implement Adobe_font_metric
4 source file of the Flower Library
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 */
9 #include "afm.hh"
10 #include "warn.hh"
12 Adobe_font_metric::Adobe_font_metric (AFM_Font_info * fi)
14 font_inf_ = fi;
16 for (int i= 256; i--;)
17 ascii_to_metric_idx_.push (-1);
19 for (int i=0; i < fi->numOfChars; i++)
21 AFM_CharMetricInfo * c = fi->cmi + i;
23 ascii_to_metric_idx_[c->code] = i;
24 name_to_metric_dict_[c->name] = i;
29 SCM
30 Adobe_font_metric::make_afm (AFM_Font_info *fi)
32 Adobe_font_metric * fm = new Adobe_font_metric (fi);
34 return fm->smobbed_self();
38 AFM_CharMetricInfo const *
39 Adobe_font_metric::find_ascii_metric (int a , bool warn) const
41 if (ascii_to_metric_idx_[a] >=0)
43 int code = ascii_to_metric_idx_[a];
44 if (code>=0)
46 return font_inf_->cmi + code;
49 else if (warn )
51 warning (_f ("can't find character number: %d", a));
54 return 0;
57 AFM_CharMetricInfo const *
58 Adobe_font_metric::find_char_metric (String nm, bool warn) const
60 map<String,int>::const_iterator ai = name_to_metric_dict_.find (nm);
62 if (ai == name_to_metric_dict_.end ())
64 if (warn)
66 warning (_f ("can't find character called: `%s'", nm.ch_C()));
68 return 0;
70 else
71 return font_inf_->cmi + (*ai).second;
75 Box
76 Adobe_font_metric::get_char (int code, bool warn) const
78 AFM_CharMetricInfo const
79 * c = find_ascii_metric (code,warn);
80 if (c)
81 return afm_bbox_to_box (c->charBBox);
82 else
83 return Box (Interval (0,0),Interval(0,0));
86 SCM
87 read_afm_file (String nm)
89 FILE *f = fopen (nm.ch_C() , "r");
91 AFM_Font_info * fi;
92 int ok = AFM_parseFile (f, &fi, ~1);
94 if (ok)
96 error (_("Error parsing AFM file"));
97 exit (2);
99 fclose (f);
101 return Adobe_font_metric::make_afm (fi);
106 afm_bbox_to_box (AFM_BBox bb)
108 return Box (Interval (bb.llx, bb.urx)* (1/1000.0),
109 Interval (bb.lly, bb.ury)* (1/1000.0));
114 Adobe_font_metric::~Adobe_font_metric ()
116 AFM_free (font_inf_);