2 afm.cc -- implement Adobe_font_metric
4 source file of the Flower Library
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
12 Adobe_font_metric::Adobe_font_metric (AFM_Font_info
* 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
;
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
];
46 return font_inf_
->cmi
+ code
;
51 warning (_f ("can't find character number: %d", a
));
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 ())
66 warning (_f ("can't find character called: `%s'", nm
.ch_C()));
71 return font_inf_
->cmi
+ (*ai
).second
;
76 Adobe_font_metric::get_char (int code
, bool warn
) const
78 AFM_CharMetricInfo
const
79 * c
= find_ascii_metric (code
,warn
);
81 return afm_bbox_to_box (c
->charBBox
);
83 return Box (Interval (0,0),Interval(0,0));
87 read_afm_file (String nm
)
89 FILE *f
= fopen (nm
.ch_C() , "r");
92 int ok
= AFM_parseFile (f
, &fi
, ~1);
96 error (_("Error parsing AFM file"));
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_
);