From: Han-Wen Nienhuys Date: Wed, 29 Dec 2004 11:30:26 +0000 (+0000) Subject: * scm/framework-texstr.scm (header): change extension to .textmetrics X-Git-Tag: release/2.5.14~344 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=dc688499ee135312d6157e603a26c2407201eee3;p=lilypond.git * scm/framework-texstr.scm (header): change extension to .textmetrics * lily/lily-parser.cc (parse_file): do try_load_text_metrics for -f tex. * lily/text-metrics.cc: new file. (try_load_text_metrics): new function * lily/include/text-metrics.hh: new file. --- diff --git a/lily/include/dimensions.hh b/lily/include/dimensions.hh index 13eab8db9f..e50c40f46b 100644 --- a/lily/include/dimensions.hh +++ b/lily/include/dimensions.hh @@ -39,6 +39,7 @@ const Real PT_TO_MM = (1.0 / MM_TO_PT); #endif String print_dimen (Real); +const Real point_constant = 1 PT; #endif /* DIMENSIONS_HH */ diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index f9cb426eba..c04221407b 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -37,6 +37,7 @@ class Beaming_info_list; class Bezier; class Bezier_bow; class Book; +class Box; class Break_algorithm; class Change_iterator; class Change_translator; diff --git a/lily/include/main.hh b/lily/include/main.hh index bd71147357..02d8e1fa39 100644 --- a/lily/include/main.hh +++ b/lily/include/main.hh @@ -19,7 +19,6 @@ void add_score (Score* s); void set_default_output (String s); String find_file (String); void call_constructors (); - Array get_inclusion_names (); void set_inclusion_names (Array); diff --git a/lily/include/text-metrics.hh b/lily/include/text-metrics.hh new file mode 100644 index 0000000000..8cf63713e4 --- /dev/null +++ b/lily/include/text-metrics.hh @@ -0,0 +1,22 @@ +/* + text-metrics.hh -- declare text metric lookup functions + + source file of the GNU LilyPond music typesetter + + (c) 2004 Han-Wen Nienhuys + +*/ + +#ifndef TEXT_METRICS_HH +#define TEXT_METRICS_HH + +#include "lily-guile.hh" +#include "box.hh" + +void try_load_text_metrics (String); +SCM ly_load_text_dimensions (SCM); +Box lookup_tex_text_dimension (Font_metric *font, + SCM text); + +#endif /* TEXT_METRICS_HH */ + diff --git a/lily/lily-parser.cc b/lily/lily-parser.cc index fb09a41e52..feb9943a7c 100644 --- a/lily/lily-parser.cc +++ b/lily/lily-parser.cc @@ -8,7 +8,7 @@ */ #include "lily-parser.hh" - +#include "text-metrics.hh" #include "book.hh" #include "lilypond-key.hh" #include "file-name.hh" @@ -86,6 +86,11 @@ Lily_parser::print_smob (SCM s, SCM port, scm_print_state*) void Lily_parser::parse_file (String init, String name, String out_name) { + if (output_format_global == "tex") + { + try_load_text_metrics (out_name); + } + lexer_ = new Lily_lexer (sources_); scm_gc_unprotect_object (lexer_->self_scm ()); // TODO: use $parser diff --git a/lily/modified-font-metric.cc b/lily/modified-font-metric.cc index de1b23e834..b424590e54 100644 --- a/lily/modified-font-metric.cc +++ b/lily/modified-font-metric.cc @@ -5,12 +5,11 @@ (c) 1999--2004 Han-Wen Nienhuys */ +#include #include "modified-font-metric.hh" #include "pango-font.hh" - -#include - +#include "text-metrics.hh" #include "warn.hh" #include "stencil.hh" @@ -265,8 +264,6 @@ Modified_font_metric::text_dimension (String text) const b.scale (magnification_); return b; } - - if (input_encoding_ == "TeX") b = tex_kludge (text); @@ -311,7 +308,6 @@ Modified_font_metric::text_dimension (String text) const if (idx >= 0) char_box = orig_->get_indexed_char (idx); - char_box.scale (magnification_); if (!char_box[X_AXIS].is_empty ()) /* length ? */ w += char_box[X_AXIS][RIGHT]; @@ -323,6 +319,7 @@ Modified_font_metric::text_dimension (String text) const ydims = Interval (0, 0); b = Box (Interval (0, w), ydims); + b.scale (magnification_); } return b; diff --git a/lily/open-type-font.cc b/lily/open-type-font.cc index da29e1884a..9664dd43ba 100644 --- a/lily/open-type-font.cc +++ b/lily/open-type-font.cc @@ -16,8 +16,6 @@ #include "dimensions.hh" #include "modified-font-metric.hh" -const Real point_constant = 1 PT; - FT_Byte * load_table (char const *tag_str, FT_Face face, FT_ULong *length) { diff --git a/lily/text-metrics.cc b/lily/text-metrics.cc new file mode 100644 index 0000000000..919401f61f --- /dev/null +++ b/lily/text-metrics.cc @@ -0,0 +1,89 @@ +/* + text-metrics.cc -- implement text metric lookup functions + + source file of the GNU LilyPond music typesetter + + (c) 2004 Han-Wen Nienhuys +*/ + +#include "dimensions.hh" +#include "font-metric.hh" +#include "main.hh" + +static SCM text_dimension_hash_tab; + + +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_BOOL_F; + if (text_dimension_hash_tab) + { + scm_hash_ref (text_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)) * point_constant; + val = scm_cdr (val); + b[Y_AXIS][UP] = scm_to_double (scm_car (val)) * point_constant; + val = scm_cdr (val); + b[Y_AXIS][DOWN] = scm_to_double (scm_car (val)) * point_constant; + } + + return b; +} + + + +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 (!text_dimension_hash_tab) + { + text_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 (text_dimension_hash_tab, key, SCM_BOOL_F) + == SCM_BOOL_F) + { + scm_hash_set_x (text_dimension_hash_tab, key, val); + } + } + + return SCM_UNSPECIFIED; +} + +void +try_load_text_metrics (String basename) +{ + String path = global_path.find_file (basename + ".textmetrics"); + if (path != "") + { + String contents (gulp_file_to_string (path)); + contents = "(quote (" + contents + "))"; + + SCM lst = scm_c_eval_string (contents.to_str0 ()); + ly_load_text_dimensions (lst); + } +} diff --git a/lily/tfm.cc b/lily/tfm.cc index ed97e417b1..6770486f88 100644 --- a/lily/tfm.cc +++ b/lily/tfm.cc @@ -15,39 +15,9 @@ #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 () { @@ -77,9 +47,9 @@ Tex_font_char_metric::dimensions () const Real point_constant = 1 PT; - return Box (Interval (0, width_*point_constant ), - Interval ((d ? height_)*point_constant)); + return Box (Interval (0, width_* point_constant ), + Interval ((d ? height_) * point_constant)); } Tex_font_metric::Tex_font_metric () @@ -169,32 +139,3 @@ 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/framework-texstr.scm b/scm/framework-texstr.scm index 1b6f4c14d7..9931a81c45 100644 --- a/scm/framework-texstr.scm +++ b/scm/framework-texstr.scm @@ -16,13 +16,12 @@ (srfi srfi-13) (lily)) - (define (header filename) (format "% header \\input{lilypond-tex-metrics} \\documentclass{article} \\lilyglobalscale{1.0} -\\lilymetricsfile{~a.lpm} +\\lilymetricsfile{~a.textmetrics} \\begin{document} " filename)) @@ -43,8 +42,6 @@ pages) (ly:outputter-dump-string outputter (footer)))) - - (define-public (convert-to-ps . args) #t) (define-public (convert-to-pdf . args) #t) (define-public (convert-to-png . args) #t) diff --git a/scm/output-texstr.scm b/scm/output-texstr.scm index c10d9bf97f..d9cc2e3b77 100644 --- a/scm/output-texstr.scm +++ b/scm/output-texstr.scm @@ -11,6 +11,7 @@ (guile) (ice-9 regex) (srfi srfi-13) + (lily output-tex) (lily)) (define (dummy . foo) #f) @@ -33,5 +34,6 @@ (hash str TEX_STRING_HASHLIMIT) (ly:font-file-name font) (ly:font-file-name font) - str) port) + (sanitize-tex-string str)) + port) )))