From f69ad11dac0effb4cbbff248f87ca61305ff52b1 Mon Sep 17 00:00:00 2001
From: hanwen <hanwen>
Date: Mon, 27 Dec 2004 23:27:50 +0000
Subject: [PATCH] * lily/modified-font-metric.cc (text_dimension): try
 lookup_tex_text_dimension() first.

* lily/tfm.cc: new function ly:load-text-dimensions
---
 ChangeLog                    |  7 ++++
 lily/include/font-metric.hh  |  2 ++
 lily/modified-font-metric.cc | 11 ++++++-
 lily/tfm.cc                  | 62 +++++++++++++++++++++++++++++++++++-
 scm/lily.scm                 |  2 ++
 scm/output-texstr.scm        |  4 +--
 6 files changed, 84 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 06157dc7a2..f104269fa9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-28  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+	* 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  <hanwen@xs4all.nl>
 
 	* 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)
-- 
2.39.5