*/
#include "tfm.hh"
+
#include "tfm-reader.hh"
#include "string-convert.hh"
#include "warn.hh"
-#include "warn.hh"
#include "dimensions.hh"
+static SCM tex_dimension_hash_tab;
static Tex_font_char_metric dummy_static_char_metric;
+
+
+Box
+lookup_tex_text_dimension (Font_metric *font,
+ SCM text)
+{
+ Box b;
+
+ SCM limit = ly_lily_module_constant ("TEX_STRING_HASHLIMIT");
+ String key_str = ly_scm2string (font->font_file_name());
+ int hash_code = scm_to_int (scm_hash (text, limit));
+ key_str = to_string (hash_code) + key_str;
+
+ SCM val = scm_hash_ref (tex_dimension_hash_tab,
+ scm_makfrom0str (key_str.to_str0 ()),
+ SCM_BOOL_F);
+
+ if (scm_is_pair (val))
+ {
+ b[X_AXIS][LEFT] = 0.0 PT;
+ b[X_AXIS][RIGHT] = scm_to_double (scm_car (val)) PT;
+ val = scm_cdr (val);
+ b[Y_AXIS][UP] = scm_to_double (scm_car (val)) PT;
+ val = scm_cdr (val);
+ b[Y_AXIS][DOWN] = scm_to_double (scm_car (val)) PT;
+ }
+
+ return b;
+}
+
+
Tex_font_char_metric::Tex_font_char_metric ()
{
exists_ = false;
encoding_table_ = SCM_EOL;
}
-
-
void
Tex_font_metric::derived_mark () const
{
}
SCM
-Tex_font_metric::make_tfm (String filename)
+Tex_font_metric::make_tfm (String file_name)
{
Tex_font_metric *tfm = new Tex_font_metric;
- Tex_font_metric_reader reader (filename);
+ Tex_font_metric_reader reader (file_name);
tfm->info_ = reader.info_;
tfm->header_ = reader.header_;
tfm->char_metrics_ = reader.char_metrics_;
tfm->ascii_to_metric_idx_ = reader.ascii_to_metric_idx_;
-
-
- tfm->encoding_table_ =
- scm_call_1 (ly_scheme_function ("get-coding-table"),
- scm_makfrom0str (tfm->info_.coding_scheme.to_str0 ()));
+ tfm->encoding_table_
+ = scm_call_1 (ly_lily_module_constant ("get-coding-table"),
+ scm_makfrom0str (tfm->coding_scheme ().to_str0 ()));
return tfm->self_scm ();
}
String
Tex_font_metric::coding_scheme () const
{
- return info_.coding_scheme;
+ String scm = info_.coding_scheme;
+
+ for(int i = 0; i < scm.length (); i++)
+ if (scm[i] == ' ')
+ scm[i] = '-';
+
+ return scm;
}
int
SCM sym = ly_symbol2scm (s.to_str0 ());
SCM idx = scm_hash_ref (encoding_table_, sym, SCM_BOOL_F);
- if (gh_char_p (idx))
+ if (ly_c_char_p (idx))
{
- return (unsigned char) gh_scm2char (idx);
+ return (unsigned char) ly_scm2char (idx);
}
else
return -1;
}
+
+
+LY_DEFINE(ly_load_text_dimensions, "ly:load-text-dimensions",
+ 1, 0, 0,
+ (SCM dimension_alist),
+ "Load dimensions from TeX in a (KEY . (W H D)) format alist")
+{
+ if (!tex_dimension_hash_tab)
+ {
+ tex_dimension_hash_tab =
+ scm_gc_protect_object (scm_make_hash_table (scm_from_int (113)));
+ }
+
+ for (SCM s = dimension_alist;
+ scm_is_pair (s);
+ s = scm_cdr (s))
+ {
+ SCM key = scm_caar (s);
+ SCM val = scm_cdar (s);
+
+ if (scm_hash_ref (tex_dimension_hash_tab, key, SCM_BOOL_F)
+ == SCM_BOOL_F)
+ {
+ scm_hash_set_x (tex_dimension_hash_tab, key, val);
+ }
+ }
+
+ return SCM_UNSPECIFIED;
+}