X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftfm.cc;h=3f415802e46bdca4c2014ed46e78733d3bd871fd;hb=2a876a1f0625e31291b3c6b2d5a65f5b1aec7dde;hp=af11940191f1475b67292ac1a1482748c9d0c163;hpb=e06b574017fe8923df3ad37e024cf850358861b7;p=lilypond.git diff --git a/lily/tfm.cc b/lily/tfm.cc index af11940191..3f415802e4 100644 --- a/lily/tfm.cc +++ b/lily/tfm.cc @@ -1,30 +1,27 @@ -/* - tfm.cc -- implement Tex_font_metric - +/* + tfm.cc -- implement Tex_font_metric + source file of the GNU LilyPond music typesetter - - (c) 1999 Jan Nieuwenhuizen - + + (c) 1999--2006 Jan Nieuwenhuizen some code shamelessly copied from GNU fontutils-0.6/tfm/tfm_input.c - */ +*/ #include "tfm.hh" -#include "tfm-reader.hh" + +#include "dimensions.hh" +#include "file-name.hh" +#include "international.hh" #include "string-convert.hh" -#include "debug.hh" +#include "tfm-reader.hh" #include "warn.hh" -Box -Tex_font_char_metric::dimensions () const -{ - 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; @@ -36,64 +33,100 @@ 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); - - return outstr + "\n"; + if (!exists_) + { + Box b; + b.set_empty (); + return b; + } + + Real d = -depth_; + Real point_constant = 1 PT; + + return Box (Interval (0, width_ * point_constant), + Interval (min (d, height_) * point_constant, + max (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 +Tex_font_metric::find_ascii (vsize ascii, bool warn) const { - if (ascii < ascii_to_metric_idx_.size() && ascii_to_metric_idx_[ascii] >= 0) - return & char_metrics_[ascii_to_metric_idx_ [ascii]]; + if (ascii != VPOS && ascii < ascii_to_metric_idx_.size () + && ascii_to_metric_idx_[ascii] != VPOS) + return &char_metrics_[ascii_to_metric_idx_ [ascii]]; else if (warn) + warning (_f ("can't find ascii character: %d", ascii)); + return &dummy_static_char_metric; +} - { - warning (_f ("Can't find ascii character: `%d'", ascii)); - } - return &dummy_static_char_metric; +/* UGH: glyphs need not be consecutive in TFM. */ +vsize +Tex_font_metric::count () const +{ + for (vsize i = ascii_to_metric_idx_.size (); i--;) + if (ascii_to_metric_idx_[i] != VPOS) + return i + 1; + return 0; } Box -Tex_font_metric::get_char (int a, bool w) const +Tex_font_metric::get_ascii_char (vsize a) const { - return find_ascii (a, w)->dimensions (); + Box b = find_ascii (a)->dimensions (); + return b; } +SCM +Tex_font_metric::make_tfm (string file_name) +{ + Tex_font_metric *tfm = new Tex_font_metric; + Tex_font_metric_reader reader (file_name); + + tfm->info_ = reader.info_; + tfm->header_ = reader.header_; + tfm->char_metrics_ = reader.char_metrics_; + tfm->ascii_to_metric_idx_ = reader.ascii_to_metric_idx_; -String -Tex_font_metric::str () const + File_name fn (file_name); + tfm->font_name_ = fn.base_; + return tfm->self_scm (); +} + +Tfm_info const & +Tex_font_metric::info () const { - String outstr; - for (int i=0; i < char_metrics_.size (); i++) - outstr += char_metrics_[i].str (); - - return outstr; + return info_; } -void -Tex_font_metric::clear (int n) +Real +Tex_font_metric::design_size () const { - for (int i=0; i < n; i++) - ascii_to_metric_idx_.push (-1); + return info_.design_size * point_constant; } +string +Tex_font_metric::font_name () const +{ + return font_name_; +} +vsize +Tex_font_metric::name_to_index (string) const +{ + assert (false); + return 0; +}