X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftfm.cc;h=0233d68a04f55fe45e6da093578979b4c235c879;hb=e58fce49b3113408254011774685370b8233df17;hp=1ae9e51f07349b8b55b1cc955bab8fdf2b8bf5b5;hpb=73be5f6fe264e90a56e45f2d70129b133731188b;p=lilypond.git diff --git a/lily/tfm.cc b/lily/tfm.cc index 1ae9e51f07..0233d68a04 100644 --- a/lily/tfm.cc +++ b/lily/tfm.cc @@ -1,9 +1,9 @@ /* - 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--2003 Jan Nieuwenhuizen some code shamelessly copied from GNU fontutils-0.6/tfm/tfm_input.c @@ -12,28 +12,47 @@ #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_)); + + Real point_constant = 1 PT; + + return Box (Interval (0, width_*point_constant ), + Interval ((d ? height_)*point_constant)); } Tex_font_char_metric::Tex_font_char_metric () { exists_b_ = false; code_ = 0;; - width_ = height_ = depth_ = italic_correction_ = 0; - width_fix_ = height_fix_ = depth_fix_ = italic_correction_fix_ = 0; + width_ = 0; + height_ = 0; + depth_ = 0; + italic_correction_ = 0; + width_fix_ = 0; + height_fix_ = 0; + depth_fix_ = 0; + italic_correction_fix_ = 0; } -#define APPEND_CHAR_METRIC_ELT(k) outstr += to_str (#k) + " " + to_str (k ## _) + "; " +#define APPEND_CHAR_METRIC_ELT(k) outstr += ::to_string (#k) + " " + ::to_string (k ## _) + "; " String -Tex_font_char_metric::str () const +Tex_font_char_metric::to_string () const { String outstr ; @@ -51,50 +70,66 @@ Tex_font_metric::Tex_font_metric () { } + static Tex_font_char_metric dummy_static_char_metric; -Tex_font_char_metric const & +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) - return char_metrics_[ascii_to_metric_idx_ [ascii]]; + 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; + return &dummy_static_char_metric; } -Character_metric* -Tex_font_metric::get_char (int a, bool w) const + +/* + UGH: glyphs need not be consecutive in TFM. + */ +int +Tex_font_metric::count () const { - return &find_ascii (a, w); + 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_ascii_char (int a) const +{ + Box b = find_ascii (a)->dimensions () ; + return b; +} String -Tex_font_metric::str () const +Tex_font_metric::to_string () const { String outstr; for (int i=0; i < char_metrics_.size (); i++) - outstr += char_metrics_[i].str (); + outstr += char_metrics_[i].to_string (); return outstr; } -void -Tex_font_metric::clear (int n) -{ - for (int i=0; i < n; i++) - ascii_to_metric_idx_.push (-1); -} -void -Tex_font_metric::read_file (String name) + + +SCM +Tex_font_metric::make_tfm (String fn) { - Tex_font_metric_reader tfm_reader (name); - *this = tfm_reader.read_tfm (); -} + Tex_font_metric * tfm = new Tex_font_metric; + Tex_font_metric_reader reader (fn); + 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 tfm->self_scm (); +}