From: Han-Wen Nienhuys Date: Mon, 27 Dec 2004 23:27:50 +0000 (+0000) Subject: * lily/modified-font-metric.cc (text_dimension): try X-Git-Tag: release/2.5.14~348 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e3a368ad1c8dc7a06491ffc4305d68d8d6e8305e;p=lilypond.git * lily/modified-font-metric.cc (text_dimension): try lookup_tex_text_dimension() first. * lily/tfm.cc: new function ly:load-text-dimensions --- diff --git a/ChangeLog b/ChangeLog index 06157dc7a2..f104269fa9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-12-28 Han-Wen Nienhuys + + * lily/modified-font-metric.cc (text_dimension): try + lookup_tex_text_dimension() first. + + * lily/tfm.cc: new function ly:load-text-dimensions + 2004-12-27 Han-Wen Nienhuys * scm/output-texstr.scm (text): use \lilygetmetrics diff --git a/lily/include/font-metric.hh b/lily/include/font-metric.hh index 6de18c5bdc..73a03daa72 100644 --- a/lily/include/font-metric.hh +++ b/lily/include/font-metric.hh @@ -60,4 +60,6 @@ public: DECLARE_UNSMOB (Font_metric, metrics); +Box lookup_tex_text_dimension (Font_metric *font, SCM text); + #endif /* FONT_METRIC_HH */ diff --git a/lily/modified-font-metric.cc b/lily/modified-font-metric.cc index 2d618993fa..f1a81ae5f9 100644 --- a/lily/modified-font-metric.cc +++ b/lily/modified-font-metric.cc @@ -258,7 +258,16 @@ Modified_font_metric::text_stencil (String text) const Box Modified_font_metric::text_dimension (String text) const { - Box b; + SCM stext = scm_makfrom0str (text.to_str0 ()); + Box b = lookup_tex_text_dimension (orig_, stext); + if (!b[Y_AXIS].is_empty ()) + { + b.scale (magnification_); + return b; + } + + + if (input_encoding_ == "TeX") b = tex_kludge (text); else if (input_encoding_ == "ASCII" diff --git a/lily/tfm.cc b/lily/tfm.cc index bad631cdc8..db117d5c33 100644 --- a/lily/tfm.cc +++ b/lily/tfm.cc @@ -15,8 +15,40 @@ #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_scheme_function ("TEX_STRING_HASHLIMIT"); + String key_str = font->font_name (); + int hash_code = scm_to_int (scm_hash (text, limit)); + key_str += to_string (hash_code); + + 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; + b[X_AXIS][RIGHT] = scm_to_double (scm_car (val)); + val = scm_cdr (val); + b[Y_AXIS][UP] = scm_to_double (scm_car (val)); + val = scm_cdr (val); + b[Y_AXIS][RIGHT] = scm_to_double (scm_car (val)); + } + + return b; +} + + Tex_font_char_metric::Tex_font_char_metric () { exists_ = false; @@ -99,7 +131,6 @@ Tex_font_metric::make_tfm (String file_name) 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->coding_scheme ().to_str0 ())); @@ -138,3 +169,32 @@ Tex_font_metric::name_to_index (String s) const 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; +} diff --git a/scm/lily.scm b/scm/lily.scm index b8e3cfc077..958f10087e 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -73,6 +73,8 @@ (format (current-error-port) "[~A]" fn)) (primitive-load fn))) +(define-public TEX_STRING_HASHLIMIT 10000000) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (type-check-list location signature arguments) diff --git a/scm/output-texstr.scm b/scm/output-texstr.scm index b7e0ef4fa0..c10d9bf97f 100644 --- a/scm/output-texstr.scm +++ b/scm/output-texstr.scm @@ -25,12 +25,12 @@ (if (string? what) what "")) - (define-public (text font str) (call-with-output-string (lambda (port) (display (format "\\lilygetmetrics{~a~a}{~a}{1.0}{~a}\n" - (hash str 10000000) + + (hash str TEX_STRING_HASHLIMIT) (ly:font-file-name font) (ly:font-file-name font) str) port)