]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-metrics.cc
* flower
[lilypond.git] / lily / text-metrics.cc
1 /*
2   text-metrics.cc -- implement text metric lookup functions
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "dimensions.hh"
10 #include "font-metric.hh"
11 #include "main.hh"
12 #include "file-path.hh"
13
14 static SCM text_dimension_hash_tab;
15
16 Box
17 lookup_tex_text_dimension (Font_metric *font, SCM text)
18 {
19   Box b;
20
21   SCM limit = ly_lily_module_constant ("TEX_STRING_HASHLIMIT");
22   String key_str = ly_scm2string (font->font_file_name ());
23   int hash_code = scm_to_int (scm_hash (text, limit));
24   key_str = to_string (hash_code) + key_str;
25
26   SCM val = SCM_BOOL_F;
27   if (text_dimension_hash_tab)
28     {
29       scm_hash_ref (text_dimension_hash_tab,
30                     scm_makfrom0str (key_str.to_str0 ()),
31                     SCM_BOOL_F);
32     }
33   if (scm_is_pair (val))
34     {
35       b[X_AXIS][LEFT] = 0.0;
36       b[X_AXIS][RIGHT] = scm_to_double (scm_car (val)) * point_constant;
37       val = scm_cdr (val);
38       b[Y_AXIS][UP] = scm_to_double (scm_car (val)) * point_constant;
39       val = scm_cdr (val);
40       b[Y_AXIS][DOWN] = scm_to_double (scm_car (val)) * point_constant;
41     }
42
43   return b;
44 }
45
46 LY_DEFINE (ly_load_text_dimensions, "ly:load-text-dimensions",
47            1, 0, 0,
48            (SCM dimension_alist),
49            "Load dimensions from TeX in a (KEY . (W H D)) format alist")
50 {
51   if (!text_dimension_hash_tab)
52     {
53       text_dimension_hash_tab
54         = scm_gc_protect_object (scm_c_make_hash_table (113));
55     }
56
57   for (SCM s = dimension_alist;
58        scm_is_pair (s);
59        s = scm_cdr (s))
60     {
61       SCM key = scm_caar (s);
62       SCM val = scm_cdar (s);
63
64       if (scm_hash_ref (text_dimension_hash_tab, key, SCM_BOOL_F)
65           == SCM_BOOL_F)
66         {
67           scm_hash_set_x (text_dimension_hash_tab, key, val);
68         }
69     }
70
71   return SCM_UNSPECIFIED;
72 }
73
74 void
75 try_load_text_metrics (String basename)
76 {
77   String path = global_path.find (basename + ".textmetrics");
78   if (path != "")
79     {
80       String contents (gulp_file_to_string (path, true));
81       contents = "(quote (" + contents + "))";
82
83       SCM lst = scm_c_eval_string (contents.to_str0 ());
84       ly_load_text_dimensions (lst);
85     }
86 }