]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/modified-font-metric.cc (text_dimension): try
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 27 Dec 2004 23:27:50 +0000 (23:27 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 27 Dec 2004 23:27:50 +0000 (23:27 +0000)
lookup_tex_text_dimension() first.

* lily/tfm.cc: new function ly:load-text-dimensions

ChangeLog
lily/include/font-metric.hh
lily/modified-font-metric.cc
lily/tfm.cc
scm/lily.scm
scm/output-texstr.scm

index 06157dc7a2477fbb9072f35469d8f825b2a0bbeb..f104269fa99844a783aa6727220587a07ed3ad5e 100644 (file)
--- 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
index 6de18c5bdc5e72fb05551d93ffa4c43f6db23973..73a03daa7235e615fd135db76320be93cec05f16 100644 (file)
@@ -60,4 +60,6 @@ public:
 
 DECLARE_UNSMOB (Font_metric, metrics);
 
+Box lookup_tex_text_dimension (Font_metric *font, SCM text);
+
 #endif /* FONT_METRIC_HH */
index 2d618993fafb8f39a943421785b015688a463d4f..f1a81ae5f9d4292d3ceef8dd3db0876f78082cdc 100644 (file)
@@ -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"
index bad631cdc82cca53564ca72c48d7e21b40bd2798..db117d5c337747bb42dfb3590a66a1a3b82df8f3 100644 (file)
 #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;
+}
index b8e3cfc0774cef9db2dc612e952a2163f2f436bc..958f10087eac9c3535ba2712f3dc5c17fa5e34ce 100644 (file)
@@ -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)
index b7e0ef4fa0edb2d877fa295068eb80cd3a661f30..c10d9bf97f1a44c4332726221d71044a3169278b 100644 (file)
   (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)