X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftfm.cc;h=942cffb3afe8fe99394177d407adeb3a8964c955;hb=e2a4be3b72b1c473658436e4f82234b401dd7b60;hp=751dc755135e37015400419de4b1174c9f24c549;hpb=7776d4901caa57e1d0f3ab7cf01348b930a6dbee;p=lilypond.git diff --git a/lily/tfm.cc b/lily/tfm.cc index 751dc75513..942cffb3af 100644 --- a/lily/tfm.cc +++ b/lily/tfm.cc @@ -3,8 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2000 Jan Nieuwenhuizen - + (c) 1999--2004 Jan Nieuwenhuizen some code shamelessly copied from GNU fontutils-0.6/tfm/tfm_input.c */ @@ -12,26 +11,15 @@ #include "tfm.hh" #include "tfm-reader.hh" #include "string-convert.hh" -#include "debug.hh" #include "warn.hh" +#include "warn.hh" +#include "dimensions.hh" -Box -Tex_font_char_metric::dimensions () const -{ - if (!exists_b_) - { - Box b; - b.set_empty (); - return b; - } - - Real d = -depth_; - return Box (Interval (0, width_),Interval ( d ? height_)); -} +static Tex_font_char_metric dummy_static_char_metric; Tex_font_char_metric::Tex_font_char_metric () { - exists_b_ = false; + exists_ = false; code_ = 0;; width_ = 0; height_ = 0; @@ -43,73 +31,113 @@ Tex_font_char_metric::Tex_font_char_metric () italic_correction_fix_ = 0; } -#define APPEND_CHAR_METRIC_ELT(k) outstr += to_str (#k) + " " + to_str (k ## _) + "; " - -String -Tex_font_char_metric::str () const +Box +Tex_font_char_metric::dimensions () const { - String outstr ; - - APPEND_CHAR_METRIC_ELT (exists_b); - APPEND_CHAR_METRIC_ELT (code); - APPEND_CHAR_METRIC_ELT (width); - APPEND_CHAR_METRIC_ELT (height); - APPEND_CHAR_METRIC_ELT (depth); - APPEND_CHAR_METRIC_ELT (italic_correction); + if (!exists_) + { + Box b; + b.set_empty (); + return b; + } + + Real d = -depth_; + + Real point_constant = 1 PT; - return outstr + "\n"; + return Box (Interval (0, width_*point_constant ), + Interval ((d ? height_)*point_constant)); } Tex_font_metric::Tex_font_metric () { + encoding_table_ = SCM_EOL; } -static Tex_font_char_metric dummy_static_char_metric; + +void +Tex_font_metric::derived_mark () const +{ + scm_gc_mark (encoding_table_); +} Tex_font_char_metric const * Tex_font_metric::find_ascii (int ascii, bool warn) const { - if (ascii < ascii_to_metric_idx_.size() && ascii_to_metric_idx_[ascii] >= 0) + if (ascii >= 0 && ascii < ascii_to_metric_idx_.size () + && ascii_to_metric_idx_[ascii] >= 0) return & char_metrics_[ascii_to_metric_idx_ [ascii]]; else if (warn) - { - warning (_f ("can't find ascii character %d", ascii)); - } + warning (_f ("can't find ascii character: %d", ascii)); return &dummy_static_char_metric; } +/* UGH: glyphs need not be consecutive in TFM. */ +int +Tex_font_metric::count () const +{ + for (int i = ascii_to_metric_idx_.size (); i--;) + if (ascii_to_metric_idx_[i] != -1) + return i + 1; + return 0; +} + Box -Tex_font_metric::get_char (int a) const +Tex_font_metric::get_ascii_char (int a) const { - Box b = find_ascii (a)->dimensions () ; + Box b = find_ascii (a)->dimensions (); return b; } - -String -Tex_font_metric::str () const +SCM +Tex_font_metric::make_tfm (String filename) { - String outstr; - for (int i=0; i < char_metrics_.size (); i++) - outstr += char_metrics_[i].str (); + Tex_font_metric *tfm = new Tex_font_metric; + Tex_font_metric_reader reader (filename); + + tfm->info_ = reader.info_; + tfm->header_ = reader.header_; + tfm->char_metrics_ = reader.char_metrics_; + tfm->ascii_to_metric_idx_ = reader.ascii_to_metric_idx_; + - return outstr; + tfm->encoding_table_ = + scm_call_1 (ly_scheme_function ("get-coding-table"), + scm_makfrom0str (tfm->coding_scheme ().to_str0 ())); + + return tfm->self_scm (); +} + +Real +Tex_font_metric::design_size () const +{ + return info_.design_size; } +String +Tex_font_metric::coding_scheme () const +{ + String scm = info_.coding_scheme; + for(int i = 0; i < scm.length (); i++) + if (scm[i] == ' ') + scm[i] = '-'; + return scm; +} -SCM -Tex_font_metric::make_tfm (String fn) +int +Tex_font_metric::name_to_index (String s) const { - Tex_font_metric * tfm_p = new Tex_font_metric; - Tex_font_metric_reader reader (fn); + SCM sym = ly_symbol2scm (s.to_str0 ()); - tfm_p->info_ = reader.info_; - tfm_p->header_ = reader.header_; - tfm_p->char_metrics_ = reader.char_metrics_; - tfm_p->ascii_to_metric_idx_ = reader.ascii_to_metric_idx_; - - return tfm_p->self_scm (); + SCM idx = scm_hash_ref (encoding_table_, sym, SCM_BOOL_F); + if (ly_c_char_p (idx)) + { + return (unsigned char) ly_scm2char (idx); + } + else + return -1; }