]> git.donarmstrong.com Git - lilypond.git/blob - lily/afm.cc
release: 1.3.20
[lilypond.git] / lily / afm.cc
1 /*   
2   afm2.cc --  implement Adobe_font_metric
3   
4   source file of the Flower Library
5   
6   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include "afm.hh"
10 #include "warn.hh"
11
12 Adobe_font_metric::Adobe_font_metric (AFM_Font_info * fi)
13 {
14   font_inf_ = fi;
15
16   for (int i= 256; i--;)
17     ascii_to_metric_idx_.push (-1);
18   
19   for (int i=0; i < fi->numOfChars; i++)
20     {
21       AFM_CharMetricInfo * c = fi->cmi + i;
22
23       ascii_to_metric_idx_[c->code] = i;
24       name_to_metric_dict_[c->name] = i;
25     }
26 }
27   
28
29 AFM_CharMetricInfo const *
30 Adobe_font_metric::find_ascii_metric (int a , bool warn) const
31 {
32   if (ascii_to_metric_idx_[a] >=0)
33     {
34       int code = ascii_to_metric_idx_[a];
35       if (code>=0)
36         {
37           return font_inf_->cmi + code;
38         }
39     }
40   else if (warn )
41     {
42       warning (_f ("Can't find character number: %d", a));
43     }
44
45   return 0;
46 }
47
48 AFM_CharMetricInfo const *
49 Adobe_font_metric::find_char_metric (String nm, bool warn) const
50 {
51   if (!name_to_metric_dict_.elem_b (nm))
52     {
53       if (warn)
54         {
55           warning (_f ("Can't find character called: `%s'", nm.ch_C()));
56         }
57       return 0;
58     }
59   else
60     return font_inf_->cmi + name_to_metric_dict_ [nm];
61 }
62
63
64 Box
65 Adobe_font_metric::get_char (int code, bool warn) const
66 {
67   AFM_CharMetricInfo const
68     * c =  find_ascii_metric (code,warn);
69   if (c)
70     return afm_bbox_to_box (c->charBBox);                       
71   else
72     return Box (Interval (0,0),Interval(0,0));
73 }
74
75 Adobe_font_metric*
76 read_afm_file (String nm)
77 {
78   FILE *f = fopen (nm.ch_C() , "r");
79
80   AFM_Font_info * fi;
81   int ok = AFM_parseFile (f, &fi, ~1);
82
83   if (ok)
84     {
85       error (_("Error parsing AFM file"));
86       exit (2);
87     }
88   fclose (f);
89
90   return new Adobe_font_metric (fi);
91 }
92
93   
94 Box
95 afm_bbox_to_box (AFM_BBox bb)
96 {
97   return Box (Interval (bb.llx, bb.urx)* (1/1000.0),
98               Interval (bb.lly, bb.ury)* (1/1000.0));
99
100 }
101   
102
103 Adobe_font_metric::~Adobe_font_metric ()
104 {
105   AFM_free (font_inf_);
106 }